Imported Upstream version 5.1.9 into tizen
[platform/upstream/giflib.git] / gifbuild.c
similarity index 95%
rename from util/gifbuild.c
rename to gifbuild.c
index 70fea58..654010d 100644 (file)
@@ -171,15 +171,12 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
         * Explicit header declarations
         */
 
-       // cppcheck-suppress invalidscanf 
        if (sscanf(buf, "screen width %d\n", &GifFileOut->SWidth) == 1)
            continue;
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "screen height %d\n", &GifFileOut->SHeight) == 1)
            continue;
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "screen colors %d\n", &n) == 1)
        {
            int ResBits = GifBitSize(n);
@@ -194,13 +191,11 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            continue;
        }
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf,
                        "screen background %d\n",
                        &GifFileOut->SBackGroundColor) == 1)
            continue;
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "pixel aspect byte %u\n", &intval) == 1) {
            GifFileOut->AspectByte = (GifByteType)(intval & 0xff);
            continue;
@@ -239,7 +234,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            memset(LocalColorKeys, '\0', sizeof(LocalColorKeys));
        }
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "  rgb %d %d %d is %c",
                   &red, &green, &blue, &KeyTable[ColorMapSize]) == 4)
        {
@@ -249,7 +243,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            ColorMapSize++;
        }
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "  rgb %d %d %d", &red, &green, &blue) == 3)
        {
            ColorMap[ColorMapSize].Red = red;
@@ -284,15 +277,15 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
        }
 
        /* GIF inclusion */
-       // cppcheck-suppress invalidscanf 
-       else if (sscanf(buf, "include %s", InclusionFile) == 1)
+       /* ugly magic number is because scanf has no */
+       else if (sscanf(buf, "include %63s", InclusionFile) == 1)
        {
            int         ErrorCode;
            bool        DoTranslation;
            GifPixelType        Translation[256];
 
            GifFileType *Inclusion;
-           SavedImage  *NewImage, *CopyFrom;
+           SavedImage  *CopyFrom;
 
            if ((Inclusion = DGifOpenFileName(InclusionFile, &ErrorCode)) == NULL) {
                PrintGifError(ErrorCode);
@@ -312,16 +305,18 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
                exit(EXIT_FAILURE);
            }
 
+           //cppcheck-suppress nullPointerRedundantCheck
            if ((DoTranslation = (GifFileOut->SColorMap!=(ColorMapObject*)NULL)))
            {
                ColorMapObject  *UnionMap;
 
-               UnionMap = GifUnionColorMap(GifFileOut->SColorMap,
-                                        Inclusion->SColorMap, Translation);
+               //cppcheck-suppress nullPointerRedundantCheck
+               UnionMap = GifUnionColorMap(GifFileOut->SColorMap, Inclusion->SColorMap, Translation);
 
                if (UnionMap == NULL)
                {
                    PARSE_ERROR("Inclusion failed --- global map conflict.");
+                   //cppcheck-suppress nullPointerRedundantCheck
                    PrintGifError(GifFileOut->Error);
                    if (Inclusion != NULL) DGifCloseFile(Inclusion, NULL);
                    if (GifFileOut != NULL) EGifCloseFile(GifFileOut, NULL);
@@ -332,13 +327,17 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
                GifFileOut->SColorMap = UnionMap;
            }
 
+           //cppcheck-suppress nullPointerRedundantCheck
            for (CopyFrom = Inclusion->SavedImages;
+                //cppcheck-suppress nullPointerRedundantCheck
                 CopyFrom < Inclusion->SavedImages + Inclusion->ImageCount;
                 CopyFrom++)
            {
+               SavedImage      *NewImage;
                if ((NewImage = GifMakeSavedImage(GifFileOut, CopyFrom)) == NULL)
                {
                    PARSE_ERROR("Inclusion failed --- out of memory.");
+                   //cppcheck-suppress nullPointerRedundantCheck
                    PrintGifError(GifFileOut->Error);
                    if (Inclusion != NULL) DGifCloseFile(Inclusion, NULL);
                    if (GifFileOut != NULL) EGifCloseFile(GifFileOut, NULL);
@@ -421,7 +420,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
 
                    while (isspace(*tp))
                        tp++;
-                   // cppcheck-suppress invalidscanf 
                    if (sscanf(tp, "disposal mode %d\n", &gcb.DisposalMode))
                        continue;
                    if (strcmp(tp, "user input flag on\n") == 0) {
@@ -432,10 +430,8 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
                        gcb.UserInputFlag = false;
                        continue;
                    }
-                   // cppcheck-suppress invalidscanf 
                    if (sscanf(tp, "delay %d\n", &gcb.DelayTime))
                        continue;
-                   // cppcheck-suppress invalidscanf 
                    if (sscanf(tp, "transparent index %d\n",
                               &gcb.TransparentColor))
                        continue;
@@ -454,7 +450,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            }
 
        }
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "netscape loop %u", &intval))
        {
            unsigned char params[3] = {1, 0, 0};
@@ -477,7 +472,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            }
            
        }
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "extension %x", &ExtCode))
        {
            int bc = 0;
@@ -538,11 +532,9 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
        /*
         * Accept image attributes
         */
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "image top %d\n", &NewImage->ImageDesc.Top) == 1)
            continue;
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf, "image left %d\n", &NewImage->ImageDesc.Left)== 1)
            continue;
 
@@ -552,7 +544,6 @@ static void Icon2Gif(char *FileName, FILE *txtin, int fdout)
            continue;
        }
 
-       // cppcheck-suppress invalidscanf 
        else if (sscanf(buf,
                        "image bits %d by %d",
                        &NewImage->ImageDesc.Width,
@@ -693,6 +684,7 @@ static void DumpExtensions(GifFileType *GifFileOut,
            putchar('\n');
            while (!last && ep[1].Function == CONTINUE_EXT_FUNC_CODE) {
                ++ep;
+               last = (ep - ExtensionBlocks == (ExtensionBlockCount - 1));
                VisibleDumpBuffer(ep->Bytes, ep->ByteCount);
                putchar('\n');
            }
@@ -704,6 +696,7 @@ static void DumpExtensions(GifFileType *GifFileOut,
            putchar('\n');
            while (!last && ep[1].Function == CONTINUE_EXT_FUNC_CODE) {
                ++ep;
+               last = (ep - ExtensionBlocks == (ExtensionBlockCount - 1));
                VisibleDumpBuffer(ep->Bytes, ep->ByteCount);
                putchar('\n');
            }
@@ -724,7 +717,10 @@ static void DumpExtensions(GifFileType *GifFileOut,
            printf("\ttransparent index %d\n", gcb.TransparentColor);
            printf("end\n\n");
        }
-       else if (ep->Function == APPLICATION_EXT_FUNC_CODE 
+       else if (!last
+                && ep->Function == APPLICATION_EXT_FUNC_CODE
+                && ep->ByteCount >= 11
+                && (ep+1)->ByteCount >= 3
                 && memcmp(ep->Bytes, "NETSCAPE2.0", 11) == 0) {
            unsigned char *params = (++ep)->Bytes;
            unsigned int loopcount = params[1] | (params[2] << 8);
@@ -735,6 +731,7 @@ static void DumpExtensions(GifFileType *GifFileOut,
            VisibleDumpBuffer(ep->Bytes, ep->ByteCount);
            while (!last && ep[1].Function == CONTINUE_EXT_FUNC_CODE) {
                ++ep;
+               last = (ep - ExtensionBlocks == (ExtensionBlockCount - 1));
                VisibleDumpBuffer(ep->Bytes, ep->ByteCount);
                putchar('\n');
            }
@@ -847,7 +844,7 @@ static void Gif2Icon(char *FileName,
        for (i = 0; i < image->ImageDesc.Height; i++) {
            for (j = 0; j < image->ImageDesc.Width; j++) {
                GifByteType ch = image->RasterBits[i*image->ImageDesc.Width + j];
-               if (ColorCount < PRINTABLES)
+               if (ColorCount < PRINTABLES && ch < PRINTABLES)
                    putchar(NameTable[ch]);
                else
                    printf("%02x", ch);
@@ -871,6 +868,17 @@ static void Gif2Icon(char *FileName,
     if (fdin == -1)
        (void) printf("# End of %s dump\n", FileName);
 
+
+    /*
+     * Sanity checks.
+     */
+
+    /* check that the background color isn't garbage (SF bug #87) */
+    if (GifFile->SBackGroundColor < 0
+           || GifFile->SBackGroundColor >= GifFile->SColorMap->ColorCount) {
+        fprintf(stderr, "gifbuild: background color invalid for screen colormap.\n");
+    }
+
     if (DGifCloseFile(GifFile, &ErrorCode) == GIF_ERROR) {
        PrintGifError(ErrorCode);
        exit(EXIT_FAILURE);