Memory leak in libpng? Or am I just dumb?

Valgrind complains about some of my code, but this code is pretty much an example of libpng code from the documentation:

Valgrind output example.

==15847== 14,384 bytes in 31 blocks are definitely lost in loss record 239 of 240 ==15847== at 0x4C28F9F: malloc (vg_replace_malloc.c:236) ==15847== by 0x5837381: ??? (in /lib/x86_64-linux-gnu/libpng12.so.0.46.0) ==15847== by 0x581FD63: png_create_info_struct (in /lib/x86_64-linux-gnu/libpng12.so.0.46.0) ==15847== by 0x67837C: Star::Image::loadPng(char const*) (StarImage.cpp:35) ==15847== by 0x4E7721: Star::Assets::threadedFetchImage(Star::String const&, bool) (StarAssets.cpp:400) ==15847== by 0x4EB4F4: Star::Assets::threadPoolMain() (StarAssets.cpp:256) ==15847== by 0x6B18B9: Star::ThreadImpl::runThread(void*) (StarThread_unix.cpp:19) ==15847== by 0x5CE2EFB: start_thread (pthread_create.c:304) ==15847== by 0x6A1359C: clone (clone.S:112) 

and the code method around line 35. Line 35 is marked with a comment and begins with png_infop end_info

 ImagePtr Image::loadPng(char const* filename) { FILE *fp = fopen(filename, "rb"); if (!fp) throw ImageException(strf("Could not open file %s in Image::loadPng", filename)); png_byte header[8]; int res = fread(header, 1, sizeof(header), fp); if (!res) throw ImageException(strf("Cannot read file %s", filename)); if (png_sig_cmp(header, 0, sizeof(header))) throw ImageException(strf("File %s is not a png image!", filename)); png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!png_ptr) { fclose(fp); throw ImageException("Internal libPNG error"); } png_infop info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { png_destroy_read_struct(&png_ptr, nullptr, nullptr); fclose(fp); throw ImageException("Internal libPNG error"); } png_infop end_info = png_create_info_struct(png_ptr); //this is line 35. if (!end_info) { png_destroy_read_struct(&png_ptr, &info_ptr, nullptr); fclose(fp); throw ImageException("Internal libPNG error"); } if (setjmp(png_jmpbuf(png_ptr))) { png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); fclose(fp); throw ImageException("Internal error reading png."); } //snip some png_read_image(png_ptr, row_ptrs.get()); png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0); fclose(fp); return image; } 

This is almost identical to the example located at http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3

Is this an internal leak? Or am I just missing something really obvious? Or is Walgrind choking?

For reference, I am currently using libpng1.2.46.

+4
source share
1 answer

Last line

  png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)0); 

should not be sooner

  png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); 

?

+7
source

All Articles