tiff read uint/int mixup

there was a uint/int mixup in the tiff reader causing problems with
tiff files written in single strips, thanks Bubba
This commit is contained in:
John Cupitt 2011-04-04 16:56:26 +01:00
parent 8d367998c6
commit ac461e5cc6
2 changed files with 18 additions and 11 deletions

View File

@ -46,6 +46,7 @@
- lots of old iofuncs API moved to deprecated - lots of old iofuncs API moved to deprecated
- added VipsOperation, an abstract base class for all vips operations - added VipsOperation, an abstract base class for all vips operations
- added VipsAdd, the first operation object - added VipsAdd, the first operation object
- im_tiff2vips() int/uint mixup for rows_per_strip, thanks Bubba
30/11/10 started 7.24.0 30/11/10 started 7.24.0
- bump for new stable - bump for new stable

View File

@ -117,6 +117,8 @@
* - oops, we can just memcpy() now heh * - oops, we can just memcpy() now heh
* - avoid unpacking via buffers if we can: either read a tile directly * - avoid unpacking via buffers if we can: either read a tile directly
* into the output region, or writeline directly from the tiff buffer * into the output region, or writeline directly from the tiff buffer
* 4/4/11
* - argh int/uint mixup for rows_per_strip, thanks Bubba
*/ */
/* /*
@ -145,9 +147,9 @@
*/ */
/* Turn on debugging output. /*
#define DEBUG
*/ */
#define DEBUG
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
@ -213,7 +215,7 @@ typedef struct {
/* Geometry. /* Geometry.
*/ */
int twidth, theight; /* Tile size */ uint32 twidth, theight; /* Tile size */
/* Only need one of these, since we mutex around TIFF*(). /* Only need one of these, since we mutex around TIFF*().
*/ */
@ -292,10 +294,10 @@ tfequals( TIFF *tif, ttag_t tag, uint16 val )
return( 1 ); return( 1 );
} }
/* Get a uint32 field. /* Get a uint32 field.
*/ */
static int static int
tfget32( TIFF *tif, ttag_t tag, int *out ) tfget32( TIFF *tif, ttag_t tag, uint32 *out )
{ {
uint32 fld; uint32 fld;
@ -305,9 +307,8 @@ tfget32( TIFF *tif, ttag_t tag, int *out )
return( 0 ); return( 0 );
} }
/* All ok.
*/
*out = fld; *out = fld;
return( 1 ); return( 1 );
} }
@ -859,6 +860,7 @@ parse_header( ReadTiff *rtiff, IMAGE *out )
{ {
int pm, bps, format; int pm, bps, format;
uint32 data_length; uint32 data_length;
uint32 width, height;
void *data; void *data;
/* Ban separate planes, too annoying. /* Ban separate planes, too annoying.
@ -870,10 +872,14 @@ parse_header( ReadTiff *rtiff, IMAGE *out )
/* Always need dimensions. /* Always need dimensions.
*/ */
if( !tfget32( rtiff->tiff, TIFFTAG_IMAGEWIDTH, &out->Xsize ) || if( !tfget32( rtiff->tiff, TIFFTAG_IMAGEWIDTH, &width ) ||
!tfget32( rtiff->tiff, TIFFTAG_IMAGELENGTH, &out->Ysize ) || !tfget32( rtiff->tiff, TIFFTAG_IMAGELENGTH, &height ) ||
parse_resolution( rtiff->tiff, out ) ) parse_resolution( rtiff->tiff, out ) )
return( -1 ); return( -1 );
if( width > INT_MAX || height > INT_MAX )
return( -1 );
out->Xsize = width;
out->Ysize = height;
/* Try to find out which type of TIFF image it is. /* Try to find out which type of TIFF image it is.
*/ */
@ -1254,7 +1260,7 @@ read_tilewise( ReadTiff *rtiff, IMAGE *out )
static int static int
read_stripwise( ReadTiff *rtiff, IMAGE *out ) read_stripwise( ReadTiff *rtiff, IMAGE *out )
{ {
int rows_per_strip; uint32 rows_per_strip;
tsize_t scanline_size; tsize_t scanline_size;
tsize_t strip_size; tsize_t strip_size;
int number_of_strips; int number_of_strips;
@ -1277,7 +1283,7 @@ read_stripwise( ReadTiff *rtiff, IMAGE *out )
number_of_strips = TIFFNumberOfStrips( rtiff->tiff ); number_of_strips = TIFFNumberOfStrips( rtiff->tiff );
#ifdef DEBUG #ifdef DEBUG
printf( "read_stripwise: rows_per_strip = %d\n", rows_per_strip ); printf( "read_stripwise: rows_per_strip = %ud\n", rows_per_strip );
printf( "read_stripwise: scanline_size = %d\n", scanline_size ); printf( "read_stripwise: scanline_size = %d\n", scanline_size );
printf( "read_stripwise: strip_size = %d\n", strip_size ); printf( "read_stripwise: strip_size = %d\n", strip_size );
printf( "read_stripwise: number_of_strips = %d\n", number_of_strips ); printf( "read_stripwise: number_of_strips = %d\n", number_of_strips );