Allow GIFs missing both Global and Local Colormaps to still decode (#494)
Ensure that a GIF without any Global or Local color tables is still decoded by libgd. GIF89a spec indicates conforming image files need not have Global or Local color tables at all. Spec recommends creating custom color map in that situation, and that at least Black+White as first two entries, to ensure B&W images are decoded. Some commonly used single-pixel GIFs found around the web are undecoded by libgd otherwise. Test case has been included. References: https://www.w3.org/Graphics/GIF/spec-gif89a.txt http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
This commit is contained in:
parent
a9a5b45983
commit
fc38677e80
@ -315,8 +315,10 @@ BGD_DECLARE(gdImagePtr) gdImageCreateFromGifCtx(gdIOCtxPtr fd)
|
||||
ReadImage(im, fd, width, height, localColorMap, BitSet(buf[8], INTERLACE), &ZeroDataBlock);
|
||||
} else {
|
||||
if(!haveGlobalColormap) {
|
||||
gdImageDestroy(im);
|
||||
return 0;
|
||||
// Still a valid gif, apply simple default palette as per spec
|
||||
ColorMap[CM_RED][1] = 0xff;
|
||||
ColorMap[CM_GREEN][1] = 0xff;
|
||||
ColorMap[CM_BLUE][1] = 0xff;
|
||||
}
|
||||
|
||||
ReadImage(im, fd, width, height, ColorMap, BitSet(buf[8], INTERLACE), &ZeroDataBlock);
|
||||
|
@ -7,4 +7,10 @@ LIST(APPEND TESTS_FILES
|
||||
bug00486
|
||||
)
|
||||
|
||||
IF(PNG_FOUND)
|
||||
LIST(APPEND TESTS_FILES
|
||||
bug00486
|
||||
)
|
||||
ENDIF(PNG_FOUND)
|
||||
|
||||
ADD_GD_TESTS()
|
||||
|
1
tests/gif/.gitignore
vendored
1
tests/gif/.gitignore
vendored
@ -8,6 +8,7 @@
|
||||
/bug00499
|
||||
/gif_im2im
|
||||
/gif_null
|
||||
/gif_nocolormaps
|
||||
/ossfuzz5700
|
||||
/php_bug_75571
|
||||
/uninitialized_memory_read
|
||||
|
@ -4,6 +4,7 @@ LIST(APPEND TESTS_FILES
|
||||
bug00227
|
||||
bug00499
|
||||
gif_null
|
||||
gif_nocolormaps
|
||||
ossfuzz5700
|
||||
php_bug_75571
|
||||
uninitialized_memory_read
|
||||
|
@ -4,6 +4,7 @@ libgd_test_programs += \
|
||||
gif/bug00227 \
|
||||
gif/bug00499 \
|
||||
gif/gif_null \
|
||||
gif/gif_nocolormaps \
|
||||
gif/ossfuzz5700 \
|
||||
gif/php_bug_75571 \
|
||||
gif/uninitialized_memory_read \
|
||||
@ -27,6 +28,7 @@ EXTRA_DIST += \
|
||||
gif/bug00060.gif \
|
||||
gif/bug00066.gif \
|
||||
gif/bug00066_exp.png \
|
||||
gif/gif_nocolormaps.gif \
|
||||
gif/ossfuzz5700.gif \
|
||||
gif/php_bug_75571.gif \
|
||||
gif/unitialized_memory_read.gif
|
||||
|
25
tests/gif/gif_nocolormaps.c
Normal file
25
tests/gif/gif_nocolormaps.c
Normal file
@ -0,0 +1,25 @@
|
||||
/**
|
||||
* Ensure that a GIF without any Global or Local color tables is still decoded
|
||||
*
|
||||
* GIF89a spec indicates conforming image files need not have Global or Local color tables at all
|
||||
*
|
||||
* See also: https://www.w3.org/Graphics/GIF/spec-gif89a.txt
|
||||
* http://probablyprogramming.com/2009/03/15/the-tiniest-gif-ever
|
||||
*/
|
||||
|
||||
#include "gd.h"
|
||||
#include "gdtest.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
gdImagePtr im;
|
||||
FILE *fp;
|
||||
|
||||
fp = gdTestFileOpen2("gif", "gif_nocolormaps.gif");
|
||||
gdTestAssert(fp != NULL);
|
||||
im = gdImageCreateFromGif(fp);
|
||||
gdTestAssert(im != NULL);
|
||||
fclose(fp);
|
||||
|
||||
return gdNumFailures();
|
||||
}
|
BIN
tests/gif/gif_nocolormaps.gif
Normal file
BIN
tests/gif/gif_nocolormaps.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 B |
Loading…
x
Reference in New Issue
Block a user