cvs: gd /libgd ISSUES gd_gif_in.c /libgd/tests bug00005.c bug00005_1.gif bug00005_2.gif bug00005_3.gif

[email protected] ("Pierre-Alain Joye")
Newsgroups php.gd.cvs
Message-ID <cvspajoye1159456969@cvsserver>
pajoye		Thu Sep 28 15:22:49 2006 UTC

  Added files:                 
    /gd/libgd/tests	bug00005_1.gif bug00005_2.gif bug00005_3.gif 
                   	bug00005.c 

  Modified files:              
    /gd/libgd	gd_gif_in.c ISSUES 
  Log:
  - GIF security fixes
  
  
http://cvs.php.net/viewvc.cgi/gd/libgd/gd_gif_in.c?r1=1.3&r2=1.4&diff_format=u
Index: gd/libgd/gd_gif_in.c
diff -u gd/libgd/gd_gif_in.c:1.3 gd/libgd/gd_gif_in.c:1.4
--- gd/libgd/gd_gif_in.c:1.3	Wed Apr  5 15:55:27 2006
+++ gd/libgd/gd_gif_in.c	Thu Sep 28 15:22:49 2006
@@ -42,7 +42,7 @@
 #define LOCALCOLORMAP  0x80
 #define BitSet(byte, bit)      (((byte) & (bit)) == (bit))
 
-#define        ReadOK(file,buffer,len) (gdGetBuf(buffer, len, file) != 0)
+#define        ReadOK(file,buffer,len) (gdGetBuf(buffer, len, file) > 0)
 
 #define LM_to_uint(a,b)                        (((b)<<8)|(a))
 
@@ -141,6 +141,8 @@
        Background      = buf[5];
        AspectRatio     = buf[6];
 #endif
+	   imw = LM_to_uint(buf[0],buf[1]);
+	   imh = LM_to_uint(buf[2],buf[3]);
 
        if (BitSet(buf[4], LOCALCOLORMAP)) {    /* Global Colormap */
                if (ReadColorMap(fd, BitPixel, ColorMap)) {
@@ -177,12 +179,17 @@
 
                bitPixel = 1<<((buf[8]&0x07)+1);
 
-               imw = LM_to_uint(buf[4],buf[5]);
-               imh = LM_to_uint(buf[6],buf[7]);
-	       if (!(im = gdImageCreate(imw, imh))) {
-			 return 0;
-	       }
-               im->interlace = BitSet(buf[8], INTERLACE);
+
+			   if (!useGlobalColormap) {
+				   if (ReadColorMap(fd, bitPixel, localColorMap)) {
+					   return 0;
+				   }
+			   }
+
+			   if (!(im = gdImageCreate(imw, imh))) {
+				   return 0;
+			   }
+			   im->interlace = BitSet(buf[8], INTERLACE);
                if (! useGlobalColormap) {
                        if (ReadColorMap(fd, bitPixel, localColorMap)) { 
                                  return 0;
@@ -205,6 +212,10 @@
        if (!im) {
 		return 0;
        }
+	   if (!im->colorsTotal) {
+		   gdImageDestroy(im);
+		   return 0;
+	   }
        /* Check for open colors at the end, so
           we can reduce colorsTotal and ultimately
           BitsPerPixel */
@@ -327,7 +338,7 @@
                buf[0] = buf[last_byte-2];
                buf[1] = buf[last_byte-1];
 
-               if ((count = GetDataBlock(fd, &buf[2], ZeroDataBlockP)) == 0)
+               if ((count = GetDataBlock(fd, &buf[2], ZeroDataBlockP)) <= 0)
                        done = TRUE;
 
                last_byte = 2 + count;
@@ -492,6 +503,18 @@
        int             v;
        int             xpos = 0, ypos = 0, pass = 0;
        int i;
+
+       /*
+       **  Initialize the Compression routines
+       */
+       if (! ReadOK(fd,&c,1)) {
+               return; 
+       }
+
+		if (c > MAX_LWZ_BITS) {
+			return;	
+		}
+
        /* Stash the color map into the image */
        for (i=0; (i<gdMaxColors); i++) {
                im->red[i] = cmap[CM_RED][i];	
@@ -501,12 +524,6 @@
        }
        /* Many (perhaps most) of these colors will remain marked open. */
        im->colorsTotal = gdMaxColors;
-       /*
-       **  Initialize the Compression routines
-       */
-       if (! ReadOK(fd,&c,1)) {
-               return; 
-       }
        if (LWZReadByte(fd, TRUE, c, ZeroDataBlockP) < 0) {
                return;
        }
http://cvs.php.net/viewvc.cgi/gd/libgd/ISSUES?r1=1.3&r2=1.4&diff_format=u
Index: gd/libgd/ISSUES
diff -u gd/libgd/ISSUES:1.3 gd/libgd/ISSUES:1.4
--- gd/libgd/ISSUES:1.3	Thu Sep 28 08:16:30 2006
+++ gd/libgd/ISSUES	Thu Sep 28 15:22:49 2006
@@ -6,3 +6,7 @@
   or invalid color index
 #3, gdImageRectangle draws corners twice (affects rectangles with alpha 
     channel)
+#4, to come
+
+#5, Numerous security fixes in GIF loader. When the gif palette is broken, 
+    the image size is invalid or NULL block at unexpected postions.

http://cvs.php.net/viewvc.cgi/gd/libgd/tests/bug00005.c?view=markup&rev=1.1
Index: gd/libgd/tests/bug00005.c
+++ gd/libgd/tests/bug00005.c
#include "gd.h"

int main()
{
 	gdImagePtr im;
	char * giffiles[3] = {"bug00005_1.gif", "bug00005_2.gif", "bug00005_3.gif"};

	FILE *fp;
	int i = 0;
	const int files_cnt = 3;

	for (i=0; i < files_cnt; i++) {
		fp = fopen(giffiles[i], "rb");
		if (!fp) {
			fprintf(stderr, "Input file does not exist!\n");
			return 1;
		}

		im = gdImageCreateFromGif(fp);

		if (!im) {
			fprintf(stderr, "%s Invalid GIF file\n", giffiles[i]);
		} else {
			fprintf(stderr, "%s valid GIF file\n", giffiles[i]);
		 	gdImageDestroy(im);
		}
	}

 	return 0;
}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.