_TIFFPartialReadStripArray: bring back support for non-conformant SLONG8 data type

Such as in https://github.com/OSGeo/gdal/issues/2165
This commit is contained in:
Even Rouault 2020-01-12 14:53:59 +01:00
parent 8192df23fa
commit 3db0ff91bc
No known key found for this signature in database
GPG Key ID: 33EBBFC47B3DD87D

View File

@ -3902,11 +3902,37 @@ TIFFReadDirectory(TIFF* tif)
break;
case TIFFTAG_STRIPOFFSETS:
case TIFFTAG_TILEOFFSETS:
switch( dp->tdir_type )
{
case TIFF_SHORT:
case TIFF_LONG:
case TIFF_LONG8:
break;
default:
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
TIFFWarningExt(tif->tif_clientdata,module,
"Invalid data type for tag %s",
fip ? fip->field_name : "unknown tagname");
break;
}
_TIFFmemcpy( &(tif->tif_dir.td_stripoffset_entry),
dp, sizeof(TIFFDirEntry) );
break;
case TIFFTAG_STRIPBYTECOUNTS:
case TIFFTAG_TILEBYTECOUNTS:
switch( dp->tdir_type )
{
case TIFF_SHORT:
case TIFF_LONG:
case TIFF_LONG8:
break;
default:
fip = TIFFFieldWithTag(tif,dp->tdir_tag);
TIFFWarningExt(tif->tif_clientdata,module,
"Invalid data type for tag %s",
fip ? fip->field_name : "unknown tagname");
break;
}
_TIFFmemcpy( &(tif->tif_dir.td_stripbytecount_entry),
dp, sizeof(TIFFDirEntry) );
break;
@ -6034,6 +6060,12 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
{
sizeofval = sizeof(uint64);
}
else if( dirent->tdir_type == TIFF_SLONG8 )
{
/* Non conformant but used by some images as in */
/* https://github.com/OSGeo/gdal/issues/2165 */
sizeofval = sizeof(int64);
}
else
{
TIFFErrorExt(tif->tif_clientdata, module,
@ -6106,7 +6138,7 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
_TIFFUnsanitizedAddUInt64AndInt(nOffset, (i + 1) * sizeofvalint) <= nOffsetEndPage;
++i )
{
if( sizeofval == sizeof(uint16) )
if( dirent->tdir_type == TIFF_SHORT )
{
uint16 val;
memcpy(&val,
@ -6116,7 +6148,7 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
TIFFSwabShort(&val);
panVals[strile + i] = val;
}
else if( sizeofval == sizeof(uint32) )
else if( dirent->tdir_type == TIFF_LONG )
{
uint32 val;
memcpy(&val,
@ -6126,7 +6158,7 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
TIFFSwabLong(&val);
panVals[strile + i] = val;
}
else
else if( dirent->tdir_type == TIFF_LONG8 )
{
uint64 val;
memcpy(&val,
@ -6136,6 +6168,17 @@ int _TIFFPartialReadStripArray( TIFF* tif, TIFFDirEntry* dirent,
TIFFSwabLong8(&val);
panVals[strile + i] = val;
}
else /* if( dirent->tdir_type == TIFF_SLONG8 ) */
{
/* Non conformant data type */
int64 val;
memcpy(&val,
buffer + (nOffset - nOffsetStartPage) + i * sizeofvalint,
sizeof(val));
if( bSwab )
TIFFSwabLong8((uint64*) &val);
panVals[strile + i] = (uint64) val;
}
}
return 1;
}