fix bug rewriting image tiles in a compressed file (gdal #4771)

This commit is contained in:
Frank Warmerdam 2012-08-13 22:10:17 +00:00
parent 76cb1b57bf
commit d85a64b6d6
2 changed files with 36 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2012-08-13 Frank Warmerdam <warmerdam@google.com>
* libtiff/tif_write.c: Fix bug rewriting image tiles in a
compressed file: http://trac.osgeo.org/gdal/ticket/4771
2012-08-02 Frank Warmerdam <warmerdam@google.com> 2012-08-02 Frank Warmerdam <warmerdam@google.com>
* libtiff/tif_dirread.c: report error in case of mismatch value * libtiff/tif_dirread.c: report error in case of mismatch value

View File

@ -1,4 +1,4 @@
/* $Id: tif_write.c,v 1.36 2011-02-18 20:53:04 fwarmerdam Exp $ */ /* $Id: tif_write.c,v 1.37 2012-08-13 22:10:17 fwarmerdam Exp $ */
/* /*
* Copyright (c) 1988-1997 Sam Leffler * Copyright (c) 1988-1997 Sam Leffler
@ -227,16 +227,27 @@ TIFFWriteEncodedStrip(TIFF* tif, uint32 strip, void* data, tmsize_t cc)
tif->tif_flags |= TIFF_CODERSETUP; tif->tif_flags |= TIFF_CODERSETUP;
} }
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
if( td->td_stripbytecount[strip] > 0 ) if( td->td_stripbytecount[strip] > 0 )
{ {
/* Make sure that at the first attempt of rewriting the tile, we will have */
/* more bytes available in the output buffer than the previous byte count, */
/* so that TIFFAppendToStrip() will detect the overflow when it is called the first */
/* time if the new compressed tile is bigger than the older one. (GDAL #4771) */
if( tif->tif_rawdatasize <= td->td_stripbytecount[strip] )
{
if( !(TIFFWriteBufferSetup(tif, NULL,
(tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[strip] + 1), 1024))) )
return ((tmsize_t)(-1));
}
/* Force TIFFAppendToStrip() to consider placing data at end /* Force TIFFAppendToStrip() to consider placing data at end
of file. */ of file. */
tif->tif_curoff = 0; tif->tif_curoff = 0;
} }
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
tif->tif_flags &= ~TIFF_POSTENCODE; tif->tif_flags &= ~TIFF_POSTENCODE;
sample = (uint16)(strip / td->td_stripsperimage); sample = (uint16)(strip / td->td_stripsperimage);
if (!(*tif->tif_preencode)(tif, sample)) if (!(*tif->tif_preencode)(tif, sample))
@ -362,16 +373,27 @@ TIFFWriteEncodedTile(TIFF* tif, uint32 tile, void* data, tmsize_t cc)
tif->tif_flags |= TIFF_BUF4WRITE; tif->tif_flags |= TIFF_BUF4WRITE;
tif->tif_curtile = tile; tif->tif_curtile = tile;
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
if( td->td_stripbytecount[tile] > 0 ) if( td->td_stripbytecount[tile] > 0 )
{ {
/* Make sure that at the first attempt of rewriting the tile, we will have */
/* more bytes available in the output buffer than the previous byte count, */
/* so that TIFFAppendToStrip() will detect the overflow when it is called the first */
/* time if the new compressed tile is bigger than the older one. (GDAL #4771) */
if( tif->tif_rawdatasize <= td->td_stripbytecount[tile] )
{
if( !(TIFFWriteBufferSetup(tif, NULL,
(tmsize_t)TIFFroundup_64((uint64)(td->td_stripbytecount[tile] + 1), 1024))) )
return ((tmsize_t)(-1));
}
/* Force TIFFAppendToStrip() to consider placing data at end /* Force TIFFAppendToStrip() to consider placing data at end
of file. */ of file. */
tif->tif_curoff = 0; tif->tif_curoff = 0;
} }
tif->tif_rawcc = 0;
tif->tif_rawcp = tif->tif_rawdata;
/* /*
* Compute tiles per row & per column to compute * Compute tiles per row & per column to compute
* current row and column * current row and column