From dde5e8f2c60bbc5da47ac90f6b48a41edd052ba3 Mon Sep 17 00:00:00 2001 From: giraffedata Date: Sun, 29 Mar 2015 02:59:09 +0000 Subject: Fix handling of corrupted GIF with neither local nor global color map git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@2434 9d0c8265-081b-0410-96cb-a4ca84ce46f8 --- converter/other/giftopnm.c | 26 ++++++++++++++++++++------ doc/HISTORY | 3 +++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/converter/other/giftopnm.c b/converter/other/giftopnm.c index 1a42ffca..2e6ae1d9 100644 --- a/converter/other/giftopnm.c +++ b/converter/other/giftopnm.c @@ -239,7 +239,15 @@ typedef struct { struct GifScreen { unsigned int width; unsigned int height; + bool hasGlobalColorMap; + /* The stream has a global color map, to wit 'colorMap'. + (If the stream doesn't have a global color map, the individual + images must each have a local color map) + */ GifColorMap colorMap; + /* The global color map for the stream. Meaningful only if + 'hasGlobalColorMap' is true. + */ unsigned int colorResolution; unsigned int background; unsigned int aspectRatio; @@ -1744,24 +1752,26 @@ readGifHeader(FILE * const gifFileP, gifScreenP->aspectRatio = buf[6]; if (verbose) { - pm_message("GIF Width = %d GIF Height = %d " - "Pixel aspect ratio = %d (%f:1)", + pm_message("GIF Width = %u GIF Height = %u " + "Pixel aspect ratio = %u (%f:1)", gifScreenP->width, gifScreenP->height, gifScreenP->aspectRatio, gifScreenP->aspectRatio == 0 ? 1 : (gifScreenP->aspectRatio + 15) / 64.0); - pm_message("Colors = %d Color Resolution = %d", + pm_message("Global color count = %u Color Resolution = %u", cmapSize, gifScreenP->colorResolution); } if (buf[4] & GLOBALCOLORMAP) { + gifScreenP->hasGlobalColorMap = true; readColorMap(gifFileP, cmapSize, &gifScreenP->colorMap, &gifScreenP->hasGray, &gifScreenP->hasColor); if (verbose) { - pm_message("Color map %s grays, %s colors", + pm_message("Global color map %s grays, %s colors", gifScreenP->hasGray ? "contains" : "doesn't contain", gifScreenP->hasColor ? "contains" : "doesn't contain"); } - } + } else + gifScreenP->hasGlobalColorMap = false; if (gifScreenP->aspectRatio != 0 && gifScreenP->aspectRatio != 49) warnUserNotSquare(gifScreenP->aspectRatio); @@ -1972,10 +1982,14 @@ convertImage(FILE * const ifP, readColorMap(ifP, imageHeader.localColorMapSize, &localColorMap, &hasGray, &hasColor); currentColorMapP = &localColorMap; - } else { + } else if (gifScreen.hasGlobalColorMap) { currentColorMapP = &gifScreen.colorMap; hasGray = gifScreen.hasGray; hasColor = gifScreen.hasColor; + } else { + pm_error("Invalid GIF: " + "Image has no local color map and stream has no global " + "color map either."); } if (!skipIt) { diff --git a/doc/HISTORY b/doc/HISTORY index c55aee65..c310bf02 100644 --- a/doc/HISTORY +++ b/doc/HISTORY @@ -21,6 +21,9 @@ not yet BJH Release 10.70.00 pgmmorphconv: add -gradient. Thanks Michael Haardt . + giftopnm: Fix bug: crashes if purported GIF has neither a global + color map nor a local one. + pgmmorphconv: fix bug: always produces PGM Plain format. pamtilt: fix bug: unconditional crash. Broken in Netpbm 10.63 -- cgit 1.4.1