Annotation of /trunk/imlib/patches/imlib-1.9.15-libpng15.patch
Parent Directory | Revision Log
Revision 1313 -
(hide annotations)
(download)
Tue May 3 16:40:43 2011 UTC (13 years, 4 months ago) by niro
File size: 10250 byte(s)
Tue May 3 16:40:43 2011 UTC (13 years, 4 months ago) by niro
File size: 10250 byte(s)
added patch to support libpng-1.5
1 | niro | 1313 | diff -Naur imlib-1.9.15/Imlib/load.c imlib-1.9.15-magellan/Imlib/load.c |
2 | --- imlib-1.9.15/Imlib/load.c 2004-09-21 02:23:20.000000000 +0200 | ||
3 | +++ imlib-1.9.15-magellan/Imlib/load.c 2011-05-03 18:02:14.000000000 +0200 | ||
4 | @@ -4,6 +4,8 @@ | ||
5 | #include "Imlib_private.h" | ||
6 | #include <setjmp.h> | ||
7 | |||
8 | +#define G_MAXINT ((int) 0x7fffffff) | ||
9 | + | ||
10 | /* Split the ID - damages input */ | ||
11 | |||
12 | static char * | ||
13 | @@ -41,13 +43,17 @@ | ||
14 | |||
15 | /* | ||
16 | * Make sure we don't wrap on our memory allocations | ||
17 | + * we check G_MAXINT/4 because rend.c malloc's w * h * bpp | ||
18 | + * + 3 is safety margin | ||
19 | */ | ||
20 | |||
21 | void * _imlib_malloc_image(unsigned int w, unsigned int h) | ||
22 | { | ||
23 | - if( w > 32767 || h > 32767) | ||
24 | + if (w <= 0 || w > 32767 || | ||
25 | + h <= 0 || h > 32767 || | ||
26 | + h >= (G_MAXINT/4 - 1) / w) | ||
27 | return NULL; | ||
28 | - return malloc(w * h * 3); | ||
29 | + return malloc(w * h * 3 + 3); | ||
30 | } | ||
31 | |||
32 | #ifdef HAVE_LIBJPEG | ||
33 | @@ -191,12 +197,12 @@ | ||
34 | png_destroy_read_struct(&png_ptr, NULL, NULL); | ||
35 | return NULL; | ||
36 | } | ||
37 | - if (setjmp(png_ptr->jmpbuf)) | ||
38 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
39 | { | ||
40 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
41 | return NULL; | ||
42 | } | ||
43 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||
44 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) | ||
45 | { | ||
46 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
47 | return NULL; | ||
48 | @@ -254,7 +260,8 @@ | ||
49 | png_read_image(png_ptr, lines); | ||
50 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
51 | ptr = data; | ||
52 | - if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||
53 | + if (color_type == PNG_COLOR_TYPE_GRAY | ||
54 | + || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) | ||
55 | { | ||
56 | for (y = 0; y < *h; y++) | ||
57 | { | ||
58 | @@ -279,6 +286,7 @@ | ||
59 | } | ||
60 | } | ||
61 | } | ||
62 | +#if 0 | ||
63 | else if (color_type == PNG_COLOR_TYPE_GRAY) | ||
64 | { | ||
65 | for (y = 0; y < *h; y++) | ||
66 | @@ -294,6 +302,7 @@ | ||
67 | } | ||
68 | } | ||
69 | } | ||
70 | +#endif | ||
71 | else | ||
72 | { | ||
73 | for (y = 0; y < *h; y++) | ||
74 | @@ -360,7 +369,9 @@ | ||
75 | npix = ww * hh; | ||
76 | *w = (int)ww; | ||
77 | *h = (int)hh; | ||
78 | - if(ww > 32767 || hh > 32767) | ||
79 | + if (ww <= 0 || ww > 32767 || | ||
80 | + hh <= 0 || hh > 32767 || | ||
81 | + hh >= (G_MAXINT/sizeof(uint32)) / ww) | ||
82 | { | ||
83 | TIFFClose(tif); | ||
84 | return NULL; | ||
85 | @@ -463,7 +474,7 @@ | ||
86 | } | ||
87 | *w = gif->Image.Width; | ||
88 | *h = gif->Image.Height; | ||
89 | - if (*h > 32767 || *w > 32767) | ||
90 | + if (*h <= 0 || *h > 32767 || *w <= 0 || *w > 32767) | ||
91 | { | ||
92 | return NULL; | ||
93 | } | ||
94 | @@ -1000,7 +1011,12 @@ | ||
95 | comment = 0; | ||
96 | quote = 0; | ||
97 | context = 0; | ||
98 | + memset(lookup, 0, sizeof(lookup)); | ||
99 | + | ||
100 | line = malloc(lsz); | ||
101 | + if (!line) | ||
102 | + return NULL; | ||
103 | + | ||
104 | while (!done) | ||
105 | { | ||
106 | pc = c; | ||
107 | @@ -1029,25 +1045,25 @@ | ||
108 | { | ||
109 | /* Header */ | ||
110 | sscanf(line, "%i %i %i %i", w, h, &ncolors, &cpp); | ||
111 | - if (ncolors > 32766) | ||
112 | + if (ncolors <= 0 || ncolors > 32766) | ||
113 | { | ||
114 | fprintf(stderr, "IMLIB ERROR: XPM files wth colors > 32766 not supported\n"); | ||
115 | free(line); | ||
116 | return NULL; | ||
117 | } | ||
118 | - if (cpp > 5) | ||
119 | + if (cpp <= 0 || cpp > 5) | ||
120 | { | ||
121 | fprintf(stderr, "IMLIB ERROR: XPM files with characters per pixel > 5 not supported\n"); | ||
122 | free(line); | ||
123 | return NULL; | ||
124 | } | ||
125 | - if (*w > 32767) | ||
126 | + if (*w <= 0 || *w > 32767) | ||
127 | { | ||
128 | fprintf(stderr, "IMLIB ERROR: Image width > 32767 pixels for file\n"); | ||
129 | free(line); | ||
130 | return NULL; | ||
131 | } | ||
132 | - if (*h > 32767) | ||
133 | + if (*h <= 0 || *h > 32767) | ||
134 | { | ||
135 | fprintf(stderr, "IMLIB ERROR: Image height > 32767 pixels for file\n"); | ||
136 | free(line); | ||
137 | @@ -1080,11 +1096,13 @@ | ||
138 | { | ||
139 | int slen; | ||
140 | int hascolor, iscolor; | ||
141 | + int space; | ||
142 | |||
143 | iscolor = 0; | ||
144 | hascolor = 0; | ||
145 | tok[0] = 0; | ||
146 | col[0] = 0; | ||
147 | + space = sizeof(col) - 1; | ||
148 | s[0] = 0; | ||
149 | len = strlen(line); | ||
150 | strncpy(cmap[j].str, line, cpp); | ||
151 | @@ -1107,11 +1125,10 @@ | ||
152 | { | ||
153 | if (k >= len) | ||
154 | { | ||
155 | - if (col[0]) | ||
156 | - strcat(col, " "); | ||
157 | - if (strlen(col) + strlen(s) < sizeof(col)) | ||
158 | - strcat(col, s); | ||
159 | - } | ||
160 | + if (col[0] && space > 0) | ||
161 | + strcat(col, " "), space -= 1; | ||
162 | + if (slen <= space) | ||
163 | + strcat(col, s), space -= slen; } | ||
164 | if (col[0]) | ||
165 | { | ||
166 | if (!strcasecmp(col, "none")) | ||
167 | @@ -1140,15 +1157,17 @@ | ||
168 | } | ||
169 | } | ||
170 | } | ||
171 | + if (slen < sizeof(tok)); | ||
172 | strcpy(tok, s); | ||
173 | col[0] = 0; | ||
174 | + space = sizeof(col) - 1; | ||
175 | } | ||
176 | else | ||
177 | { | ||
178 | - if (col[0]) | ||
179 | - strcat(col, " "); | ||
180 | - strcat(col, s); | ||
181 | - } | ||
182 | + if (col[0] && space > 0) | ||
183 | + strcat(col, " "), space -=1; | ||
184 | + if (slen <= space) | ||
185 | + strcat(col, s), space -= slen; } | ||
186 | } | ||
187 | } | ||
188 | } | ||
189 | @@ -1376,12 +1395,12 @@ | ||
190 | sscanf(s, "%i %i", w, h); | ||
191 | a = *w; | ||
192 | b = *h; | ||
193 | - if (a > 32767) | ||
194 | + if (a <= 0 || a > 32767) | ||
195 | { | ||
196 | fprintf(stderr, "IMLIB ERROR: Image width > 32767 pixels for file\n"); | ||
197 | return NULL; | ||
198 | } | ||
199 | - if (b > 32767) | ||
200 | + if (b <= 0 || b > 32767) | ||
201 | { | ||
202 | fprintf(stderr, "IMLIB ERROR: Image height > 32767 pixels for file\n"); | ||
203 | return NULL; | ||
204 | diff -Naur imlib-1.9.15/Imlib/save.c imlib-1.9.15-magellan/Imlib/save.c | ||
205 | --- imlib-1.9.15/Imlib/save.c 2004-09-21 02:22:59.000000000 +0200 | ||
206 | +++ imlib-1.9.15-magellan/Imlib/save.c 2011-05-03 18:03:59.000000000 +0200 | ||
207 | @@ -342,7 +342,7 @@ | ||
208 | png_destroy_write_struct(&png_ptr, (png_infopp) NULL); | ||
209 | return 0; | ||
210 | } | ||
211 | - if (setjmp(png_ptr->jmpbuf)) | ||
212 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
213 | { | ||
214 | fclose(f); | ||
215 | png_destroy_write_struct(&png_ptr, (png_infopp) NULL); | ||
216 | diff -Naur imlib-1.9.15/Imlib/utils.c imlib-1.9.15-magellan/Imlib/utils.c | ||
217 | --- imlib-1.9.15/Imlib/utils.c 2004-09-21 02:22:59.000000000 +0200 | ||
218 | +++ imlib-1.9.15-magellan/Imlib/utils.c 2011-05-03 18:06:41.000000000 +0200 | ||
219 | @@ -1496,36 +1496,56 @@ | ||
220 | context = 0; | ||
221 | ptr = NULL; | ||
222 | end = NULL; | ||
223 | + memset(lookup, 0, sizeof(lookup)); | ||
224 | |||
225 | while (!done) | ||
226 | { | ||
227 | line = data[count++]; | ||
228 | + if (!line) | ||
229 | + break; | ||
230 | + line = strdup(line); | ||
231 | + if (!line) | ||
232 | + break; | ||
233 | + len = strlen(line); | ||
234 | + for (i = 0; i < len; ++i) | ||
235 | + { | ||
236 | + c = line[i]; | ||
237 | + if (c < 32) | ||
238 | + line[i] = 32; | ||
239 | + else if (c > 127) | ||
240 | + line[i] = 127; | ||
241 | + } | ||
242 | + | ||
243 | if (context == 0) | ||
244 | { | ||
245 | /* Header */ | ||
246 | sscanf(line, "%i %i %i %i", &w, &h, &ncolors, &cpp); | ||
247 | - if (ncolors > 32766) | ||
248 | + if (ncolors <= 0 || ncolors > 32766) | ||
249 | { | ||
250 | fprintf(stderr, "IMLIB ERROR: XPM data wth colors > 32766 not supported\n"); | ||
251 | free(im); | ||
252 | + free(line); | ||
253 | return NULL; | ||
254 | } | ||
255 | - if (cpp > 5) | ||
256 | + if (cpp <= 0 || cpp > 5) | ||
257 | { | ||
258 | fprintf(stderr, "IMLIB ERROR: XPM data with characters per pixel > 5 not supported\n"); | ||
259 | free(im); | ||
260 | + free(line); | ||
261 | return NULL; | ||
262 | } | ||
263 | - if (w > 32767) | ||
264 | + if (w <= 0 || w > 32767) | ||
265 | { | ||
266 | fprintf(stderr, "IMLIB ERROR: Image width > 32767 pixels for data\n"); | ||
267 | free(im); | ||
268 | + free(line); | ||
269 | return NULL; | ||
270 | } | ||
271 | - if (h > 32767) | ||
272 | + if (h <= 0 || h > 32767) | ||
273 | { | ||
274 | fprintf(stderr, "IMLIB ERROR: Image height > 32767 pixels for data\n"); | ||
275 | free(im); | ||
276 | + free(line); | ||
277 | return NULL; | ||
278 | } | ||
279 | cmap = malloc(sizeof(struct _cmap) * ncolors); | ||
280 | @@ -1533,6 +1553,7 @@ | ||
281 | if (!cmap) | ||
282 | { | ||
283 | free(im); | ||
284 | + free(line); | ||
285 | return NULL; | ||
286 | } | ||
287 | im->rgb_width = w; | ||
288 | @@ -1542,6 +1563,7 @@ | ||
289 | { | ||
290 | free(cmap); | ||
291 | free(im); | ||
292 | + free(line); | ||
293 | return NULL; | ||
294 | } | ||
295 | im->alpha_data = NULL; | ||
296 | @@ -1817,6 +1839,7 @@ | ||
297 | } | ||
298 | if ((ptr) && ((ptr - im->rgb_data) >= w * h * 3)) | ||
299 | done = 1; | ||
300 | + free(line); | ||
301 | } | ||
302 | if (!transp) | ||
303 | { | ||
304 | @@ -1959,13 +1982,13 @@ | ||
305 | return NULL; | ||
306 | } | ||
307 | |||
308 | - if (setjmp(png_ptr->jmpbuf)) | ||
309 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
310 | { | ||
311 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
312 | return NULL; | ||
313 | } | ||
314 | |||
315 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||
316 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) | ||
317 | { | ||
318 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
319 | return NULL; | ||
320 | diff -Naur imlib-1.9.15/gdk_imlib/io-png.c imlib-1.9.15-magellan/gdk_imlib/io-png.c | ||
321 | --- imlib-1.9.15/gdk_imlib/io-png.c 2002-03-04 18:06:29.000000000 +0100 | ||
322 | +++ imlib-1.9.15-magellan/gdk_imlib/io-png.c 2011-05-03 17:56:26.000000000 +0200 | ||
323 | @@ -40,13 +40,13 @@ | ||
324 | return NULL; | ||
325 | } | ||
326 | |||
327 | - if (setjmp(png_ptr->jmpbuf)) | ||
328 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
329 | { | ||
330 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
331 | return NULL; | ||
332 | } | ||
333 | |||
334 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||
335 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) | ||
336 | { | ||
337 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
338 | return NULL; | ||
339 | @@ -275,13 +275,13 @@ | ||
340 | return NULL; | ||
341 | } | ||
342 | |||
343 | - if (setjmp(png_ptr->jmpbuf)) | ||
344 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
345 | { | ||
346 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
347 | return NULL; | ||
348 | } | ||
349 | |||
350 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||
351 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) | ||
352 | { | ||
353 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
354 | return NULL; | ||
355 | @@ -301,6 +301,9 @@ | ||
356 | /* Setup Translators */ | ||
357 | if (color_type == PNG_COLOR_TYPE_PALETTE) | ||
358 | png_set_expand(png_ptr); | ||
359 | + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) | ||
360 | + png_set_expand(png_ptr); | ||
361 | + | ||
362 | png_set_strip_16(png_ptr); | ||
363 | png_set_packing(png_ptr); | ||
364 | if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) | ||
365 | @@ -440,13 +443,13 @@ | ||
366 | return NULL; | ||
367 | } | ||
368 | |||
369 | - if (setjmp(png_ptr->jmpbuf)) | ||
370 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
371 | { | ||
372 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
373 | return NULL; | ||
374 | } | ||
375 | |||
376 | - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) | ||
377 | + if (png_get_color_type(png_ptr, info_ptr) == PNG_COLOR_TYPE_RGB_ALPHA) | ||
378 | { | ||
379 | png_destroy_read_struct(&png_ptr, &info_ptr, NULL); | ||
380 | return NULL; | ||
381 | @@ -635,7 +638,7 @@ | ||
382 | png_destroy_write_struct(&png_ptr, (png_infopp) NULL); | ||
383 | return 0; | ||
384 | } | ||
385 | - if (setjmp(png_ptr->jmpbuf)) | ||
386 | + if (setjmp(png_jmpbuf(png_ptr))) | ||
387 | { | ||
388 | fclose(f); | ||
389 | png_destroy_write_struct(&png_ptr, (png_infopp) NULL); |