--- OLD/libtiff/tif_packbits.c Thu Jan 1 00:00:00 1970 +++ NEW/libtiff/tif_packbits.c Thu Jan 1 00:00:00 1970 @@ -39,13 +39,23 @@ static int PackBitsPreEncode(TIFF* tif) { + int *pvp; + + if (tif->tif_data == 0) { + tif->tif_data = _TIFFmalloc(sizeof(int)); + if (tif->tif_data == 0) { + TIFFError("PackBitsPreEncode","No space for state"); + return(0); + } + } + pvp = (int *) tif->tif_data; /* * Calculate the scanline/tile-width size in bytes. */ if (isTiled(tif)) - tif->tif_data = (tidata_t) TIFFTileRowSize(tif); + *pvp = TIFFTileRowSize(tif); else - tif->tif_data = (tidata_t) TIFFScanlineSize(tif); + *pvp = TIFFScanlineSize(tif); return (1); } @@ -180,7 +190,7 @@ static int PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s) { - tsize_t rowsize = (tsize_t) tif->tif_data; + tsize_t rowsize = * (int *) tif->tif_data; assert(rowsize > 0); while ((long)cc > 0) { @@ -235,6 +245,15 @@ return (1); } +static void +PackBitsCleanup(TIFF *tif) +{ + if (tif->tif_data) { + _TIFFfree(tif->tif_data); + tif->tif_data = 0; + } +} + int TIFFInitPackBits(TIFF* tif) { @@ -245,5 +264,6 @@ tif->tif_encoderow = PackBitsEncode; tif->tif_encodestrip = PackBitsEncodeChunk; tif->tif_encodetile = PackBitsEncodeChunk; + tif->tif_cleanup = PackBitsCleanup; return (1); }