fix bug rewriting image tiles in a compressed file (gdal #4771)
This commit is contained in:
parent
76cb1b57bf
commit
d85a64b6d6
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user