The cirros image was rebuilt against the 3.13.0-83 kernel, drivers e1000e, igbvf...
[packages/trusty/cirros-testvm.git] / cirros-testvm / src-cirros / buildroot-2015.05 / package / imlib2 / 0002-GIF-loader-Simplify-error-handling.patch
diff --git a/cirros-testvm/src-cirros/buildroot-2015.05/package/imlib2/0002-GIF-loader-Simplify-error-handling.patch b/cirros-testvm/src-cirros/buildroot-2015.05/package/imlib2/0002-GIF-loader-Simplify-error-handling.patch
new file mode 100644 (file)
index 0000000..c2b5254
--- /dev/null
@@ -0,0 +1,175 @@
+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
+