From: Jan Wielemaker Date: Thu, 18 Aug 2011 09:46:53 +0000 (+0200) Subject: SECURITY: Bug#7 Gif-reader bufferoverflow. Petr Pisar. X-Git-Url: http://www.swi-prolog.org/packages/xpce.git/commitdiff_plain/bb328029beb148691edc031d9db9cf0a503c8247 SECURITY: Bug#7 Gif-reader bufferoverflow. Petr Pisar. See http://www.swi-prolog.org/bugzilla/show_bug.cgi?id=7 See https://bugzilla.redhat.com/show_bug.cgi?id=727800 This patch follows a corresponding patch in CUPS: CUPS was fixed recently (in 1.4.7) and now does code > max_code check http://cups.org/str.php?L3867 svn diff -c 9840 http://svn.easysw.com/public/cups/ --- diff --git a/src/img/gifread.c b/src/img/gifread.c index bb66705..a12a2d8 100644 --- a/src/img/gifread.c +++ b/src/img/gifread.c @@ -169,7 +169,7 @@ GIFReadFD(IOSTREAM *fd, /* read colormaps */ if ( BitSet((UCHAR) buf[4], LOCALCOLORMAP) ) { if ( (rval=ReadColorMap(fd, GifScreen.BitPixel, at, ac, closure)) - != GIF_OK ) + != GIF_OK ) { setGifError("Error reading GIF colormap"); return rval; } @@ -487,11 +487,11 @@ LZWReadByte(IOSTREAM * fd, int flag, int input_code_size) max_code = clear_code + 2; sp = stack; firstcode = oldcode = GetCode(fd, code_size, FALSE); - return firstcode; - } else if (code == end_code) + return (firstcode&255); + } else if (code == end_code || code > max_code) { int count; - UCHAR buf[260]; + UCHAR buf[260]; /* Block buffer */ if (ZeroDataBlock) return -2; @@ -504,7 +504,7 @@ LZWReadByte(IOSTREAM * fd, int flag, int input_code_size) } incode = code; - if (code >= max_code) + if (code == max_code) { *sp++ = firstcode; code = oldcode; @@ -537,9 +537,9 @@ LZWReadByte(IOSTREAM * fd, int flag, int input_code_size) oldcode = incode; if (sp > stack) - return *--sp; + return ((*--sp) & 255); } - return code; + return (code&255); }