From 908a179726d010963f4fe1b57fb5f7bf590d7d64 Mon Sep 17 00:00:00 2001
From: Kim Woelders <kim@woelders.dk>
Date: Tue, 31 Dec 2013 18:13:45 +0100
Subject: [PATCH 2/5] GIF loader: Simplify error handling.

Also:
- Fix memory leak when image data allocation fails.
- Some aux data arrays may as well be const.
---
 src/modules/loaders/loader_gif.c | 80 ++++++++++++++++------------------------
 1 file changed, 32 insertions(+), 48 deletions(-)

diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
index d1c2ae2..a39c860 100644
--- a/src/modules/loaders/loader_gif.c
+++ b/src/modules/loaders/loader_gif.c
@@ -8,6 +8,9 @@ char
 load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
      char immediate_load)
 {
+   static const int    intoffset[] = { 0, 4, 2, 1 };
+   static const int    intjump[] = { 8, 8, 4, 2 };
+   int                 rc;
    DATA32             *ptr;
    GifFileType        *gif;
    GifRowType         *rows;
@@ -16,8 +19,6 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
    int                 i, j, done, bg, r, g, b, w = 0, h = 0;
    float               per = 0.0, per_inc;
    int                 last_per = 0, last_y = 0;
-   int                 intoffset[] = { 0, 4, 2, 1 };
-   int                 intjump[] = { 8, 8, 4, 2 };
    int                 transp;
    int                 fd;
 
@@ -49,6 +50,8 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
         return 0;
      }
 
+   rc = 0;                      /* Failure */
+
    do
      {
         if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
@@ -66,37 +69,19 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
              w = gif->Image.Width;
              h = gif->Image.Height;
              if (!IMAGE_DIMENSIONS_OK(w, h))
-               {
-                  DGifCloseFile(gif);
-                  return 0;
-               }
-             rows = malloc(h * sizeof(GifRowType *));
+                goto quit2;
+
+             rows = calloc(h, sizeof(GifRowType *));
              if (!rows)
-               {
-                  DGifCloseFile(gif);
-                  return 0;
-               }
-             for (i = 0; i < h; i++)
-               {
-                  rows[i] = NULL;
-               }
+                goto quit2;
+
              for (i = 0; i < h; i++)
                {
                   rows[i] = malloc(w * sizeof(GifPixelType));
                   if (!rows[i])
-                    {
-                       DGifCloseFile(gif);
-                       for (i = 0; i < h; i++)
-                         {
-                            if (rows[i])
-                              {
-                                 free(rows[i]);
-                              }
-                         }
-                       free(rows);
-                       return 0;
-                    }
+                     goto quit;
                }
+
              if (gif->Image.Interlace)
                {
                   for (i = 0; i < 4; i++)
@@ -135,6 +120,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
           }
      }
    while (rec != TERMINATE_RECORD_TYPE);
+
    if (transp >= 0)
      {
         SET_FLAG(im->flags, F_HAS_ALPHA);
@@ -143,6 +129,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
      {
         UNSET_FLAG(im->flags, F_HAS_ALPHA);
      }
+
    /* set the format string member to the lower-case full extension */
    /* name for the format - so example names would be: */
    /* "png", "jpeg", "tiff", "ppm", "pgm", "pbm", "gif", "xpm" ... */
@@ -150,17 +137,15 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
    im->h = h;
    if (!im->format)
       im->format = strdup("gif");
+
    if (im->loader || immediate_load || progress)
      {
         bg = gif->SBackGroundColor;
         cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap);
         im->data = (DATA32 *) malloc(sizeof(DATA32) * w * h);
         if (!im->data)
-          {
-             DGifCloseFile(gif);
-             free(rows);
-             return 0;
-          }
+           goto quit;
+
         ptr = im->data;
         per_inc = 100.0 / (((float)w) * h);
         for (i = 0; i < h; i++)
@@ -188,30 +173,29 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
                        last_per = (int)per;
                        if (!(progress(im, (int)per, 0, last_y, w, i)))
                          {
-                            DGifCloseFile(gif);
-                            for (i = 0; i < h; i++)
-                              {
-                                 free(rows[i]);
-                              }
-                            free(rows);
-                            return 2;
+                            rc = 2;
+                            goto quit;
                          }
                        last_y = i;
                     }
                }
           }
+
+        if (progress)
+           progress(im, 100, 0, last_y, w, h);
      }
-   if (progress)
-     {
-        progress(im, 100, 0, last_y, w, h);
-     }
-   DGifCloseFile(gif);
+
+   rc = 1;                      /* Success */
+
+ quit:
    for (i = 0; i < h; i++)
-     {
-        free(rows[i]);
-     }
+      free(rows[i]);
    free(rows);
-   return 1;
+
+ quit2:
+   DGifCloseFile(gif);
+
+   return rc;
 }
 
 void
-- 
2.3.1

