# HG changeset patch # User michael # Date 1174837426 0 # Node ID 5db8e9e8f71d6f5406f7f5a715c12e1ae00d753f # Parent 23f8f6efc870410295ddc159552608c08b0ea037 move eob_reached logic into ff_lzw_decode_tail() which simplifies the code, avoids some checks in the innermost loop and also gets rid of the controversal break while hopefully retaining the last byte in a valid bytestream, invalid bytestreams still can have very significant overread diff -r 23f8f6efc870 -r 5db8e9e8f71d lzw.c --- a/lzw.c Sun Mar 25 15:09:16 2007 +0000 +++ b/lzw.c Sun Mar 25 15:43:46 2007 +0000 @@ -42,7 +42,6 @@ }; struct LZWState { - int eob_reached; uint8_t *pbuf, *ebuf; int bbits; unsigned int bbuf; @@ -74,10 +73,6 @@ while (s->bbits < s->cursize) { if (!s->bs) { s->bs = *s->pbuf++; - if(!s->bs) { - s->eob_reached = 1; - break; - } } s->bbuf |= (*s->pbuf++) << s->bbits; s->bbits += 8; @@ -87,9 +82,6 @@ s->bbuf >>= s->cursize; } else { // TIFF while (s->bbits < s->cursize) { - if (s->pbuf >= s->ebuf) { - s->eob_reached = 1; - } s->bbuf = (s->bbuf << 8) | (*s->pbuf++); s->bbits += 8; } @@ -107,8 +99,14 @@ void ff_lzw_decode_tail(LZWState *p) { struct LZWState *s = (struct LZWState *)p; - while(!s->eob_reached) - lzw_get_code(s); + + if(s->mode == FF_LZW_GIF) { + while(s->pbuf < s->ebuf && s->bs>0){ + s->pbuf += s->bs; + s->bs = *s->pbuf++; + } + }else + s->pbuf= s->ebuf; } void ff_lzw_decode_open(LZWState **p) @@ -136,7 +134,6 @@ if(csize < 1 || csize > LZW_MAXBITS) return -1; /* read buffer */ - s->eob_reached = 0; s->pbuf = buf; s->ebuf = s->pbuf + buf_size; s->bbuf = 0;