From: Fabian Keil Date: Tue, 9 Feb 2021 19:20:34 +0000 (+0100) Subject: gif_deanimate(): Tolerate multiple image extensions in a row X-Git-Tag: v_3_0_34~149 X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=commitdiff_plain;h=aba07103acfd91d5d757defe94da356fba33af98;hp=88993eb0cce227219e7d27406c38266d1aaffc10 gif_deanimate(): Tolerate multiple image extensions in a row This allows to deanimate all the gifs on: https://commons.wikimedia.org/wiki/Category:Animated_smilies Fixes SF bug #795 reported by Celejar. --- diff --git a/deanimate.c b/deanimate.c index a6759da4..79751222 100644 --- a/deanimate.c +++ b/deanimate.c @@ -328,6 +328,7 @@ int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_im { unsigned char c; struct binbuffer *image; + int image_buffered = 0; if (NULL == src || NULL == dst) { @@ -398,8 +399,14 @@ int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_im * Image block: Extract to current image buffer. */ case 0x2c: - image->offset = 0; + if (image_buffered == 1) + { + /* Discard previous image. */ + image->offset = 0; + image_buffered = 0; + } if (gif_extract_image(src, image)) goto failed; + image_buffered = 1; if (get_first_image) goto write; continue; @@ -410,14 +417,16 @@ int gif_deanimate(struct binbuffer *src, struct binbuffer *dst, int get_first_im switch (buf_getbyte(src, 1)) { /* - * Image extension: Copy extension header and image - * to the current image buffer + * Image extension: Copy extension header + * and continue looking for new blocks. */ case 0xf9: - image->offset = 0; - if (buf_copy(src, image, 8) || buf_getbyte(src, 0) != 0x2c) goto failed; - if (gif_extract_image(src, image)) goto failed; - if (get_first_image) goto write; + if (image_buffered == 1) + { + image->offset = 0; + image_buffered = 0; + } + if (buf_copy(src, image, 8)) goto failed; continue; /*