qiqian / webp

Automatically exported from code.google.com/p/webp
0 stars 0 forks source link

Segfaulting on debian on trying to compress any data. #151

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Segfault occurs on calling WebPEncodeRGBA on 3.0 version.

More concrete, it occurs on /src/enc/picture.c in fragment:

======================================================================
1156   ok = import(&pic, rgba, stride) && WebPEncode(&config, &pic);
1157   WebPPictureFree(&pic);
1158   if (!ok) {
1159     free(wrt.mem);
1160     *output = NULL;
1161     return 0;
1162   }
1163   *output = wrt.mem;
1164   return wrt.size;
1165 }
======================================================================

On line:  *output = wrt.mem;

Here is simple program which segfaults:

=====================================================

#include <stdio.h>
#include <stdlib.h>

#include "webp-src/src/webp/decode.h"
#include "webp-src/src/webp/encode.h"

int main(int argc, char *argv[])
{
    uint8_t *buffer;
    FILE *fh = fopen("/webp-src/examples/test_ref.ppm", "rb");
    if ( fh != NULL )
    {
        fseek(fh, 0L, SEEK_END);
        long s = ftell(fh);
        rewind(fh);
        buffer = (uint8_t*)malloc(s);
        if ( buffer != NULL )
        {
            fread(buffer, s, 1, fh);
            // we can now close the file
            fclose(fh); fh = NULL;

            // do something, e.g.
            fwrite(buffer, s, 1, stdout);

            free(buffer);
        }
        if (fh != NULL) fclose(fh);
    }    

    uint8_t** retb;
    int size = WebPEncodeRGBA(buffer, 128, 128, 129, 100, retb); 
    printf("size: %d\n", size);

}

=====================================================

No matter which data I'm passing to WebPEncodeRGBA, or which stride 
value(tested from 1 to 256), it segfaults.

The OS is Debian Wheezy.

I'm building libwebp with attached Makefile. The example program is built with 
such command:

g++ "webp-src/src/dsp/.libs/libwebpdsp_la-upsampling_neon.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-enc.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-cpu.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-dec_sse2.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-yuv.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-lossless.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-enc_neon.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-dec_neon.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-dec.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-upsampling.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-upsampling_sse2.o" 
"webp-src/src/dsp/.libs/libwebpdsp_la-enc_sse2.o" 
"webp-src/src/enc/.libs/libwebpencode_la-config.o" 
"webp-src/src/enc/.libs/libwebpencode_la-webpenc.o" 
"webp-src/src/enc/.libs/libwebpencode_la-iterator.o" 
"webp-src/src/enc/.libs/libwebpencode_la-filter.o" 
"webp-src/src/enc/.libs/libwebpencode_la-backward_references.o" 
"webp-src/src/enc/.libs/libwebpencode_la-quant.o" 
"webp-src/src/enc/.libs/libwebpencode_la-cost.o" 
"webp-src/src/enc/.libs/libwebpencode_la-frame.o" 
"webp-src/src/enc/.libs/libwebpencode_la-syntax.o" 
"webp-src/src/enc/.libs/libwebpencode_la-histogram.o" 
"webp-src/src/enc/.libs/libwebpencode_la-alpha.o" 
"webp-src/src/enc/.libs/libwebpencode_la-token.o" 
"webp-src/src/enc/.libs/libwebpencode_la-vp8l.o" 
"webp-src/src/enc/.libs/libwebpencode_la-picture.o" 
"webp-src/src/enc/.libs/libwebpencode_la-analysis.o" 
"webp-src/src/enc/.libs/libwebpencode_la-tree.o" 
"webp-src/src/enc/.libs/libwebpencode_la-layer.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-alpha.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-vp8.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-quant.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-tree.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-io.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-vp8l.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-buffer.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-idec.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-webp.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-layer.o" 
"webp-src/src/dec/.libs/libwebpdecode_la-frame.o" 
"webp-src/src/utils/.libs/color_cache.o" "webp-src/src/utils/.libs/utils.o" 
"webp-src/src/utils/.libs/quant_levels.o" 
"webp-src/src/utils/.libs/bit_writer.o" "webp-src/src/utils/.libs/thread.o" 
"webp-src/src/utils/.libs/quant_levels_dec.o" 
"webp-src/src/utils/.libs/bit_reader.o" "webp-src/src/utils/.libs/huffman.o" 
"webp-src/src/utils/.libs/rescaler.o" "webp-src/src/utils/.libs/filters.o" 
"webp-src/src/utils/.libs/huffman_encode.o" failer.c

Original issue reported on code.google.com by axande...@gmail.com on 12 May 2013 at 10:21

Attachments:

GoogleCodeExporter commented 8 years ago
Hi,

(thanks for the precise report!)

in addition to the invalid "free(buffer)" problem reported above, there other 
problems too:

* you should pass "&retb", as in:
uint8_t* retb;
int size = WebPEncodeRGBA(buffer, ...., &retb);

* you are calling WebPEncodeRGBA(), which expects RGBA pixels (4 bytes per 
pixel). However, PPM format is in 'RGB' format. There's no alpha channel, so 
each pixel is RGB only (3 bytes). You should call WebPEncodeRGB() instead.

* the stride passed (129) is strange

* Note that PPM format also has a header information, it's not just plain RGB 
pixel values.

* don't forget to "free(retb)" !

Here's a somewhat corrected version:

#include <stdio.h>
#include <stdlib.h>

#include "webp/encode.h"

int main(int argc, char *argv[])
{
    uint8_t *buffer = NULL;
    FILE *fh = fopen("./test_ref.ppm", "rb");
    if ( fh != NULL )
    {
        fseek(fh, 0L, SEEK_END);
        long s = ftell(fh);
        rewind(fh);
        buffer = (uint8_t*)malloc(s);
        if ( buffer != NULL )
        {
            fread(buffer, s, 1, fh);

            // do something, e.g.
            fwrite(buffer, s, 1, stdout);
        }
        fclose(fh);
    }
    if (buffer == NULL) return -1;  // error

    uint8_t* retb = NULL;
    size_t size = WebPEncodeRGB(buffer, 128, 128, 3 * 128, 100, &retb);
    printf("size: %d\n", (int)size);
    free(buffer);
    free(retb);
    return 0;
}

Original comment by pascal.m...@gmail.com on 13 May 2013 at 5:07