1 From 908a179726d010963f4fe1b57fb5f7bf590d7d64 Mon Sep 17 00:00:00 2001
2 From: Kim Woelders <kim@woelders.dk>
3 Date: Tue, 31 Dec 2013 18:13:45 +0100
4 Subject: [PATCH 2/5] GIF loader: Simplify error handling.
7 - Fix memory leak when image data allocation fails.
8 - Some aux data arrays may as well be const.
10 src/modules/loaders/loader_gif.c | 80 ++++++++++++++++------------------------
11 1 file changed, 32 insertions(+), 48 deletions(-)
13 diff --git a/src/modules/loaders/loader_gif.c b/src/modules/loaders/loader_gif.c
14 index d1c2ae2..a39c860 100644
15 --- a/src/modules/loaders/loader_gif.c
16 +++ b/src/modules/loaders/loader_gif.c
18 load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
21 + static const int intoffset[] = { 0, 4, 2, 1 };
22 + static const int intjump[] = { 8, 8, 4, 2 };
27 @@ -16,8 +19,6 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
28 int i, j, done, bg, r, g, b, w = 0, h = 0;
29 float per = 0.0, per_inc;
30 int last_per = 0, last_y = 0;
31 - int intoffset[] = { 0, 4, 2, 1 };
32 - int intjump[] = { 8, 8, 4, 2 };
36 @@ -49,6 +50,8 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
40 + rc = 0; /* Failure */
44 if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
45 @@ -66,37 +69,19 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
47 h = gif->Image.Height;
48 if (!IMAGE_DIMENSIONS_OK(w, h))
53 - rows = malloc(h * sizeof(GifRowType *));
56 + rows = calloc(h, sizeof(GifRowType *));
62 - for (i = 0; i < h; i++)
68 for (i = 0; i < h; i++)
70 rows[i] = malloc(w * sizeof(GifPixelType));
74 - for (i = 0; i < h; i++)
87 if (gif->Image.Interlace)
89 for (i = 0; i < 4; i++)
90 @@ -135,6 +120,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
93 while (rec != TERMINATE_RECORD_TYPE);
97 SET_FLAG(im->flags, F_HAS_ALPHA);
98 @@ -143,6 +129,7 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
100 UNSET_FLAG(im->flags, F_HAS_ALPHA);
103 /* set the format string member to the lower-case full extension */
104 /* name for the format - so example names would be: */
105 /* "png", "jpeg", "tiff", "ppm", "pgm", "pbm", "gif", "xpm" ... */
106 @@ -150,17 +137,15 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
109 im->format = strdup("gif");
111 if (im->loader || immediate_load || progress)
113 bg = gif->SBackGroundColor;
114 cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap);
115 im->data = (DATA32 *) malloc(sizeof(DATA32) * w * h);
118 - DGifCloseFile(gif);
125 per_inc = 100.0 / (((float)w) * h);
126 for (i = 0; i < h; i++)
127 @@ -188,30 +173,29 @@ load(ImlibImage * im, ImlibProgressFunction progress, char progress_granularity,
129 if (!(progress(im, (int)per, 0, last_y, w, i)))
131 - DGifCloseFile(gif);
132 - for (i = 0; i < h; i++)
147 + progress(im, 100, 0, last_y, w, h);
151 - progress(im, 100, 0, last_y, w, h);
153 - DGifCloseFile(gif);
155 + rc = 1; /* Success */
158 for (i = 0; i < h; i++)
167 + DGifCloseFile(gif);