diff --git a/src/modules/Image/encodings/gif.c b/src/modules/Image/encodings/gif.c index e114270a4fc0f1beb196e223f18eca5be17a7fd0..9651a98eff176dde0e5641dfb89fff0a1def4535 100644 --- a/src/modules/Image/encodings/gif.c +++ b/src/modules/Image/encodings/gif.c @@ -1,9 +1,9 @@ -/* $Id: gif.c,v 1.26 1998/01/16 22:33:12 grubba Exp $ */ +/* $Id: gif.c,v 1.27 1998/01/18 22:15:33 mirar Exp $ */ /* **! module Image **! note -**! $Id: gif.c,v 1.26 1998/01/16 22:33:12 grubba Exp $ +**! $Id: gif.c,v 1.27 1998/01/18 22:15:33 mirar Exp $ **! submodule GIF **! **! This submodule keep the GIF encode/decode capabilities @@ -31,7 +31,7 @@ #include "stralloc.h" #include "global.h" -RCSID("$Id: gif.c,v 1.26 1998/01/16 22:33:12 grubba Exp $"); +RCSID("$Id: gif.c,v 1.27 1998/01/18 22:15:33 mirar Exp $"); #include "pike_macros.h" #include "object.h" #include "constants.h" @@ -1645,6 +1645,12 @@ static void _gif_decode_lzw(unsigned char *s, unsigned int q; unsigned int mask=(unsigned short)((1<<bits)-1); +#ifdef GIF_DEBUG + int debug=0; + +fprintf(stderr,"_gif_decode_lzw(%lx,%lu,%d,%lx,%lx,%lx,%lu,%d)\n", + s,len,obits,ncto,dest,alpha,dlen,tidx); +#endif nct=(struct neo_colortable*)get_storage(ncto,image_colortable_program); if (!nct || nct->type!=NCT_FLAT) return; /* uh? */ @@ -1673,13 +1679,23 @@ static void _gif_decode_lzw(unsigned char *s, q>>=bits; bit-=bits; +#ifdef GIF_DEBUG + if (debug) fprintf(stderr,"code=%d 0x%x bits=%d\n",n,n,bits); +#endif + if (n==m) { c[n].prev=last; c[n].c=c[last].c; c[n].len=c[last].len+1; } - else if (n>=m) break; /* illegal code */ + else if (n>=m) + { +#ifdef GIF_DEBUG + fprintf(stderr,"cancel; illegal code, %d>=%d at %lx\n",n,m,s); +#endif + break; /* illegal code */ + } if (!c[n].len) { if (n==clearcode) { @@ -1687,15 +1703,29 @@ static void _gif_decode_lzw(unsigned char *s, mask=(1<<bits)-1; m=endcode; last=clearcode; + maxcode=1<<bits; + } + else + { + /* endcode */ +#ifdef GIF_DEBUG + fprintf(stderr,"endcode at %lx\n",s); +#endif + break; } - else break; /* endcode */ } else { struct lzwc *myc; rgb_group *d,*da=NULL; unsigned short lc; myc=c+n; - if (myc->len>dlen) break; + if (myc->len>dlen) + { +#ifdef GIF_DEBUG + fprintf(stderr,"cancel at dlen left=%lu\n",dlen); +#endif + break; + } d=(dest+=myc->len); if (alpha) da=(alpha+=myc->len); @@ -1726,18 +1756,36 @@ static void _gif_decode_lzw(unsigned char *s, m++; if (m>=maxcode) - { - bits++; - mask=(1<<bits)-1; - maxcode<<=1; - if (maxcode>MAX_GIF_CODE) break; /* error! too much codes */ - } + if (m==MAX_GIF_CODE) + { +#ifdef GIF_DEBUG + fprintf(stderr,"too many codes at %lx\n",s); +#endif + m--; + bits=12; + } + else + { + bits++; + mask=(1<<bits)-1; + maxcode<<=1; + if (maxcode>MAX_GIF_CODE) + { +#ifdef GIF_DEBUG + fprintf(stderr,"cancel; gif codes=%ld m=%ld\n",maxcode,m); +#endif + break; /* error! too much codes */ + } + } } while (bit<bits && len) q|=((*s)<<bit),bit+=8,s++,len--; } +#ifdef GIF_DEBUG + fprintf(stderr,"end. bit=%d\n",bit); +#endif free(c); }