Index: filter/image-gif.c =================================================================== --- filter/image-gif.c (revision 9839) +++ filter/image-gif.c (working copy) @@ -353,7 +353,7 @@ * Read in another buffer... */ - if ((count = gif_get_block (fp, buf + last_byte)) <= 0) + if ((count = gif_get_block(fp, buf + last_byte)) <= 0) { /* * Whoops, no more data! @@ -582,20 +582,14 @@ gif_get_code(fp, 0, 1); /* - * Wipe the decompressor table... + * Wipe the decompressor table (already mostly 0 due to the calloc above...) */ fresh = 1; - for (i = 0; i < clear_code; i ++) - { - table[0][i] = 0; + for (i = 1; i < clear_code; i ++) table[1][i] = i; - } - for (; i < 4096; i ++) - table[0][i] = table[1][0] = 0; - sp = stack; return (0); @@ -605,30 +599,31 @@ fresh = 0; do + { firstcode = oldcode = gif_get_code(fp, code_size, 0); + } while (firstcode == clear_code); - return (firstcode); + return (firstcode & 255); } else if (!table) return (0); if (sp > stack) - return (*--sp); + return ((*--sp) & 255); - while ((code = gif_get_code (fp, code_size, 0)) >= 0) + while ((code = gif_get_code(fp, code_size, 0)) >= 0) { if (code == clear_code) { - for (i = 0; i < clear_code; i ++) - { - table[0][i] = 0; + /* + * Clear/reset the compression table... + */ + + memset(table, 0, 2 * sizeof(gif_table_t)); + for (i = 1; i < clear_code; i ++) table[1][i] = i; - } - for (; i < 4096; i ++) - table[0][i] = table[1][i] = 0; - code_size = set_code_size + 1; max_code_size = 2 * clear_code; max_code = clear_code + 2; @@ -637,13 +632,12 @@ firstcode = oldcode = gif_get_code(fp, code_size, 0); - return (firstcode); + return (firstcode & 255); } - else if (code == end_code) + else if (code == end_code || code > max_code) { - unsigned char buf[260]; + unsigned char buf[260]; /* Block buffer */ - if (!gif_eof) while (gif_get_block(fp, buf) > 0); @@ -652,7 +646,7 @@ incode = code; - if (code >= max_code) + if (code == max_code) { *sp++ = firstcode; code = oldcode; @@ -686,10 +680,10 @@ oldcode = incode; if (sp > stack) - return (*--sp); + return ((*--sp) & 255); } - return (code); + return (code & 255); }