I am receiveing a strange segfault in FreeImage_GetPixelColor(). I'm running on Linux Mint 19.1 Cinnamon x86 64-bit with the FreeImage library version being : "Version: 3.17.0+ds1-5build2" .
When I try to load a 512x512 pixel TIFF, consisting of a solid blue square, and generated by the GIMP, I get a ton of non-fatal FreeImage messages on STDERR such as : "TIFFFieldWithTag: Internal error, unknown tag 0xa420." My main problem is that, after I've initialized the FreeImage library and loaded the TIFF into a FIBITMAP pointer, when I call FreeImage_GetPixelColor(), it segfaults. Here is the GDB backtrace :
$ gdb ./ccc
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./ccc...done.
(gdb) run test.tiff
Starting program: /home/jdb2/repos/repos/trunk/ccc/ccc test.tiff
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
( This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details )
TIFFFieldWithTag: Internal error, unknown tag 0x829a.
TIFFFieldWithTag: Internal error, unknown tag 0x829d.
TIFFFieldWithTag: Internal error, unknown tag 0x8822.
TIFFFieldWithTag: Internal error, unknown tag 0x8824.
TIFFFieldWithTag: Internal error, unknown tag 0x8827.
TIFFFieldWithTag: Internal error, unknown tag 0x8828.
TIFFFieldWithTag: Internal error, unknown tag 0x9000.
TIFFFieldWithTag: Internal error, unknown tag 0x9003.
TIFFFieldWithTag: Internal error, unknown tag 0x9004.
TIFFFieldWithTag: Internal error, unknown tag 0x9101.
TIFFFieldWithTag: Internal error, unknown tag 0x9102.
TIFFFieldWithTag: Internal error, unknown tag 0x9201.
TIFFFieldWithTag: Internal error, unknown tag 0x9202.
TIFFFieldWithTag: Internal error, unknown tag 0x9203.
TIFFFieldWithTag: Internal error, unknown tag 0x9204.
TIFFFieldWithTag: Internal error, unknown tag 0x9205.
TIFFFieldWithTag: Internal error, unknown tag 0x9206.
TIFFFieldWithTag: Internal error, unknown tag 0x9207.
TIFFFieldWithTag: Internal error, unknown tag 0x9208.
TIFFFieldWithTag: Internal error, unknown tag 0x9209.
TIFFFieldWithTag: Internal error, unknown tag 0x920a.
TIFFFieldWithTag: Internal error, unknown tag 0x9214.
TIFFFieldWithTag: Internal error, unknown tag 0x927c.
TIFFFieldWithTag: Internal error, unknown tag 0x9286.
TIFFFieldWithTag: Internal error, unknown tag 0x9290.
TIFFFieldWithTag: Internal error, unknown tag 0x9291.
TIFFFieldWithTag: Internal error, unknown tag 0x9292.
TIFFFieldWithTag: Internal error, unknown tag 0xa000.
TIFFFieldWithTag: Internal error, unknown tag 0xa001.
TIFFFieldWithTag: Internal error, unknown tag 0xa002.
TIFFFieldWithTag: Internal error, unknown tag 0xa003.
TIFFFieldWithTag: Internal error, unknown tag 0xa004.
TIFFFieldWithTag: Internal error, unknown tag 0xa20b.
TIFFFieldWithTag: Internal error, unknown tag 0xa20c.
TIFFFieldWithTag: Internal error, unknown tag 0xa20e.
TIFFFieldWithTag: Internal error, unknown tag 0xa20f.
TIFFFieldWithTag: Internal error, unknown tag 0xa210.
TIFFFieldWithTag: Internal error, unknown tag 0xa214.
TIFFFieldWithTag: Internal error, unknown tag 0xa215.
TIFFFieldWithTag: Internal error, unknown tag 0xa217.
TIFFFieldWithTag: Internal error, unknown tag 0xa300.
TIFFFieldWithTag: Internal error, unknown tag 0xa301.
TIFFFieldWithTag: Internal error, unknown tag 0xa302.
TIFFFieldWithTag: Internal error, unknown tag 0xa401.
TIFFFieldWithTag: Internal error, unknown tag 0xa402.
TIFFFieldWithTag: Internal error, unknown tag 0xa403.
TIFFFieldWithTag: Internal error, unknown tag 0xa404.
TIFFFieldWithTag: Internal error, unknown tag 0xa405.
TIFFFieldWithTag: Internal error, unknown tag 0xa406.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa408.
TIFFFieldWithTag: Internal error, unknown tag 0xa409.
TIFFFieldWithTag: Internal error, unknown tag 0xa40a.
TIFFFieldWithTag: Internal error, unknown tag 0xa40b.
TIFFFieldWithTag: Internal error, unknown tag 0xa40c.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa420.
TIFFFieldWithTag: Internal error, unknown tag 0x829a.
TIFFFieldWithTag: Internal error, unknown tag 0x829d.
TIFFFieldWithTag: Internal error, unknown tag 0x8822.
TIFFFieldWithTag: Internal error, unknown tag 0x8824.
TIFFFieldWithTag: Internal error, unknown tag 0x8827.
TIFFFieldWithTag: Internal error, unknown tag 0x8828.
TIFFFieldWithTag: Internal error, unknown tag 0x9000.
TIFFFieldWithTag: Internal error, unknown tag 0x9003.
TIFFFieldWithTag: Internal error, unknown tag 0x9004.
TIFFFieldWithTag: Internal error, unknown tag 0x9101.
TIFFFieldWithTag: Internal error, unknown tag 0x9102.
TIFFFieldWithTag: Internal error, unknown tag 0x9201.
TIFFFieldWithTag: Internal error, unknown tag 0x9202.
TIFFFieldWithTag: Internal error, unknown tag 0x9203.
TIFFFieldWithTag: Internal error, unknown tag 0x9204.
TIFFFieldWithTag: Internal error, unknown tag 0x9205.
TIFFFieldWithTag: Internal error, unknown tag 0x9206.
TIFFFieldWithTag: Internal error, unknown tag 0x9207.
TIFFFieldWithTag: Internal error, unknown tag 0x9208.
TIFFFieldWithTag: Internal error, unknown tag 0x9209.
TIFFFieldWithTag: Internal error, unknown tag 0x920a.
TIFFFieldWithTag: Internal error, unknown tag 0x9214.
TIFFFieldWithTag: Internal error, unknown tag 0x927c.
TIFFFieldWithTag: Internal error, unknown tag 0x9286.
TIFFFieldWithTag: Internal error, unknown tag 0x9290.
TIFFFieldWithTag: Internal error, unknown tag 0x9291.
TIFFFieldWithTag: Internal error, unknown tag 0x9292.
TIFFFieldWithTag: Internal error, unknown tag 0xa000.
TIFFFieldWithTag: Internal error, unknown tag 0xa001.
TIFFFieldWithTag: Internal error, unknown tag 0xa002.
TIFFFieldWithTag: Internal error, unknown tag 0xa003.
TIFFFieldWithTag: Internal error, unknown tag 0xa004.
TIFFFieldWithTag: Internal error, unknown tag 0xa20b.
TIFFFieldWithTag: Internal error, unknown tag 0xa20c.
TIFFFieldWithTag: Internal error, unknown tag 0xa20e.
TIFFFieldWithTag: Internal error, unknown tag 0xa20f.
TIFFFieldWithTag: Internal error, unknown tag 0xa210.
TIFFFieldWithTag: Internal error, unknown tag 0xa214.
TIFFFieldWithTag: Internal error, unknown tag 0xa215.
TIFFFieldWithTag: Internal error, unknown tag 0xa217.
TIFFFieldWithTag: Internal error, unknown tag 0xa300.
TIFFFieldWithTag: Internal error, unknown tag 0xa301.
TIFFFieldWithTag: Internal error, unknown tag 0xa302.
TIFFFieldWithTag: Internal error, unknown tag 0xa401.
TIFFFieldWithTag: Internal error, unknown tag 0xa402.
TIFFFieldWithTag: Internal error, unknown tag 0xa403.
TIFFFieldWithTag: Internal error, unknown tag 0xa404.
TIFFFieldWithTag: Internal error, unknown tag 0xa405.
TIFFFieldWithTag: Internal error, unknown tag 0xa406.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa408.
TIFFFieldWithTag: Internal error, unknown tag 0xa409.
TIFFFieldWithTag: Internal error, unknown tag 0xa40a.
TIFFFieldWithTag: Internal error, unknown tag 0xa40b.
TIFFFieldWithTag: Internal error, unknown tag 0xa40c.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa407.
TIFFFieldWithTag: Internal error, unknown tag 0xa420.
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff77bc92c in FreeImage_GetPixelColor (dib=0x5555557847b0, x=0,
y=<optimized out>, value=0x555555554e70 <_start>)
at Source/FreeImage/PixelAccess.cpp:97
97 Source/FreeImage/PixelAccess.cpp: No such file or directory.
(gdb) bt full
#0 0x00007ffff77bc92c in FreeImage_GetPixelColor (dib=0x5555557847b0, x=0,
y=<optimized out>, value=0x555555554e70 <_start>)
at Source/FreeImage/PixelAccess.cpp:97
bits = 0x7ffff7e4d1b0 "\377"
#1 0x00005555555551a1 in getPixels (image=0x5555557847b0, pixels1=0x7ffff3c0c010,
width1=512, height1=512) at ccc-common.c:124
rgb1 = 0x555555554e70 <_start>
t1 = 0x7fffffffe330
x = 0
y = 0
#2 0x0000555555555953 in main (argc=2, argv=0x7fffffffe338) at ccc-compress.c:211
cpmsg = 0x7ffff780f130 "This program uses FreeImage, a free, open source image library supporting all common bitmap formats. See http://freeimage.sourceforge.net for details"
image_data = 0x5555557847b0
file_name = 0x7fffffffe5fe "test.tiff"
file_type = 18
rgb2 = 0x0
width = 512
height = 512
pixels = 0x7ffff3c0c010
pixel_luminances = 0x7ffff3a0b010
pixel_blocks = 0x7ffff354a010
histogram = 0x7ffff5938a7b
histogram2 = 0x7ffff701d090
histogram3 = 0x7fffffffe050
---Type <return> to continue, or q <return> to quit---
lookup_table = {3, 0, 8064, 65535, 0 <repeats 35 times>, 4294901760, 255, 0, 0,
16842752, 1886220131, 1936942450, 7237481, 1936876918, 0, 0, 0, 0, 0, 0,
4294967295, 65535, 0, 0, 0, 0, 4294967295, 4294967295, 4294967295,
4294967295, 4, 4, 4, 4, 4151845920, 32767, 4151845920, 32767,
0 <repeats 18 times>, 48, 0, 0, 4, 7, 0, 64, 0, 1433767968, 21845, 96, 0,
4294967216, 4294967295, 1, 0, 4, 49, 0, 0, 0, 0, 0, 0, 124, 119, 110, 91,
4094517519, 32767, 0, 0, 48, 0, 4294967216, 4294967295, 4094517519, 32767,
1433937872, 21845, 1433937880, 21845, 1433937920, 21845, 4148351228, 32767,
0, 0, 4119574120, 32767, 1433937728, 21845, 3206661376, 2710890644, 0, 0,
1433939712, 21845, 0, 0, 4119574538, 32767, 4119623504, 32767, 4120094211,
32767, 4294967295, 4294967295, 4294967295, 4294967295, 4, 4, 4, 4,
4151845920, 32767, 4151845920, 32767, 0 <repeats 44 times>, 110, 91, 128, 0,
0, 9, 48, 0, 144, 4, 7, 0, 64, 0, 1433767968, 21845, 96, 0, 4294967216,
4294967295, 1, 0, 4, 49, 0, 0, 0, 0, 0, 0, 124, 119, 110, 91, 128, 0,
4294967216, 4294967295, 48, 0, 4294967216, 4294967295, 1433929240, 21845}
lb1 = 0
raw = <error reading variable raw (value requires 3749387308 bytes, which is more than max-value-size)>
(gdb) continue
Continuing.
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
(gdb)
I don't know what is causing this segfault.
Attached is the 512x512 pixel TIFF file which is just a blue square generated and exported from the GIMP.
Any help would be appreciated.
Thanks,
jdb2
Just to make things a little more clear, here is the path my code takes before calling FreeImage_GetPixelColor() at which point I receive a segfault from the FreeImage library :
As for ccc-common.c and ccc-common.h, the relevant code is :
and
I apologize for the sloppiness in the code. The code is in the pre-alpha stage and is in a constant state of flux and there are a lot of errors to fix in the rest of the code.
Any help on resolving the apparent bug in the FreeImage library would be welcome.
jdb2
Last edit: jdb2 2019-07-23
I just tested it on a 2 inch x 2 inch TIFF file with a blue box inside created with Windows Paint, and I get the same errors and segfault. This is definitely a bug in FreeImage.
jdb2
Last edit: jdb2 2019-07-22
Not sure if it's related but it looks like the cases in the switch(file_type) can fall through. That is, they don't break when errorlevel==0.
Well, if errorlevel is equal to zero, then there is no error exit from main(), but I don't see how that would cause the switch statement to misbehave, as, in each case, the code is :
If errorlevel is equal to zero, then this code never gets executed. I do know that the switch statement works for TIFF files as getPixels() eventually gets called which calls FreeImage_GetPixelColor(), which is the source of the segfault.
Regards,
jdb2
Say file_type is FIF_TIFF and FreeImage_Load(FIF_TIFF,...) works. That is, errorlevel==0. Execution will fall through to the default: case and call GenericLoader(...).
I guess I'm suggesting adding break to each case, e.g.:
Ooops! :D I made a boo-boo and overlooked that :P -- stupid mistake. I also code in Verilog RTL and other languages and I forgot about inserting the breaks for some reason :$
I've corrected the code in the switch statement but the same problems still manifest themselves in terms of FreeImage_GetImage_color() segfaulting and spitting out non-fatal errors.
Thanks for the heads up on my stupid mistake :)
Regards,
jdb2
Just to eliminate any unknowns, I temporarily commented out all file type detection code and loaded the test.tiff file using a hard coded name in the source. I get the same segfault in FreeImage_GetPixelColor()
jdb2
Something I just noticed is that the call to FreeImage_GetPixelColor is passing an uninitialized pointer for the RGBQUAD.
Yeah, and GCC complains about it :) According to the FreeImage manual :
That is, the RGBQUAD pointer isn't initialized as FreeImage_GetPixelColor() is supposed to set it :) I guess I could initialize it to NULL before calling the function. I'll try that now...
Also, I generated another test image, this time a 512x512 pixel JPEG exported from the GIMP and FreeImage_GetPixelColor() still segfaults.
Regards,
jdb2
Well, I just tried setting rgb1 in getPixels() to NULL before I call FreeImage_GetPixelColor() and I still get the same segfault, although now GCC doesn't complain about a possibly unitialized variable.
jdb2
FreeImage_GetPIxelColor() takes an RGBQUAD pointer, so the code :
generates the following errors :
rgb1 is passed by value but its value is a pointer to an RGBQUAD :)
jdb2
Last edit: jdb2 2019-07-23
FreeImage_GetPixelColor can't set the pointer for you in this case. It is taking the pointer by value (that is, it passes a copy of the pointer you pass). Things might be different if it took a pointer to pointer or a reference to a pointer.
I believe the expected behavior is for FreeImage_GetPixelColor to write the color to the RGBQUAD pointed at by the pointer you pass. I would try creating a local RGBQUAD and passing its address as the pointer.
It looks like you've found the source of the problem! :D Thanks so much! I guess I wasn't fully understanding the semantics of the RGBQUAD pointer passed to FreeImage_GetPixelColor().
My code now doesn't segfault in the FreeImage library anymore thanks to your suggestion :D
Thanks a lot! :D
I'll mark this "bug "as solved / closed :)
Regards,
jdb2
Well, I can't seem to figure out how to mark this ticket as closed / solved, so an admin will have to do it, unless I'm missing something obvious, which I probably am :).
jdb2
Hi,
To sum up
using
RGBQUAD *rgb2 = FreeImage_GetPalette(image_data);
rgb2 is NULL for 24-bit images
using
FreeImage_ConvertTo24Bits(image_data);
will cause a memory leak
use instead
FIBITMAP *dst = FreeImage_ConvertTo24Bits(image_data);
if(dst) {
FreeImage_Unload(image_data);
image_data = dst;
}
else {
FreeImage_Unload(image_data);
return 1;
}
Use
RGBQUAD rgb1 = {0, 0, 0, 0};
if(!FreeImage_GetPixelColor(image, (unsigned) x, (unsigned) y, &rgb1)) {
...
}
Note that you can optimize pixel access using FreeImage_GetScanLine and memcpy
Hervé