Index: third_party/libtiff/tif_dirread.c |
diff --git a/third_party/tiff_v403/tif_dirread.c b/third_party/libtiff/tif_dirread.c |
similarity index 98% |
rename from third_party/tiff_v403/tif_dirread.c |
rename to third_party/libtiff/tif_dirread.c |
index b9e4ffae09ac1743c8feb59802041480b166455a..a0dc68b78e040fdd6e8b467464da889ae43ecc24 100644 |
--- a/third_party/tiff_v403/tif_dirread.c |
+++ b/third_party/libtiff/tif_dirread.c |
@@ -1,4 +1,4 @@ |
-/* $Id: tif_dirread.c,v 1.178 2012-08-19 16:56:34 bfriesen Exp $ */ |
+/* $Id: tif_dirread.c,v 1.191 2015-09-05 20:31:41 bfriesen Exp $ */ |
/* |
* Copyright (c) 1988-1997 Sam Leffler |
@@ -38,7 +38,7 @@ |
* the pointer to the appropriate TIFFField structure early on in |
* TIFFReadDirectory, so as to eliminate current possibly repetitive lookup. |
*/ |
- |
+ |
#include "tiffiop.h" |
#define IGNORE 0 /* tag placeholder used below */ |
@@ -2172,11 +2172,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntrySlong8Array(TIFF* tif, TIFFDirEn |
break; |
} |
_TIFFfree(origdata); |
- if (err!=TIFFReadDirEntryErrOk) |
- { |
- _TIFFfree(data); |
- return(err); |
- } |
*value=data; |
return(TIFFReadDirEntryErrOk); |
} |
@@ -2414,11 +2409,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryFloatArray(TIFF* tif, TIFFDirEnt |
break; |
} |
_TIFFfree(origdata); |
- if (err!=TIFFReadDirEntryErrOk) |
- { |
- _TIFFfree(data); |
- return(err); |
- } |
*value=data; |
return(TIFFReadDirEntryErrOk); |
} |
@@ -2657,11 +2647,6 @@ TIFFReadDirEntryDoubleArray(TIFF* tif, TIFFDirEntry* direntry, double** value) |
break; |
} |
_TIFFfree(origdata); |
- if (err!=TIFFReadDirEntryErrOk) |
- { |
- _TIFFfree(data); |
- return(err); |
- } |
*value=data; |
return(TIFFReadDirEntryErrOk); |
} |
@@ -2723,11 +2708,6 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryIfd8Array(TIFF* tif, TIFFDirEntr |
break; |
} |
_TIFFfree(origdata); |
- if (err!=TIFFReadDirEntryErrOk) |
- { |
- _TIFFfree(data); |
- return(err); |
- } |
*value=data; |
return(TIFFReadDirEntryErrOk); |
} |
@@ -3194,11 +3174,7 @@ static enum TIFFReadDirEntryErr TIFFReadDirEntryCheckRangeLongSlong(int32 value) |
/* |
* Largest 32-bit unsigned integer value. |
*/ |
-#if defined(__WIN32__) && defined(_MSC_VER) |
-# define TIFF_UINT32_MAX 0xFFFFFFFFI64 |
-#else |
-# define TIFF_UINT32_MAX 0xFFFFFFFFLL |
-#endif |
+#define TIFF_UINT32_MAX 0xFFFFFFFFU |
static enum TIFFReadDirEntryErr |
TIFFReadDirEntryCheckRangeLongLong8(uint64 value) |
@@ -3212,7 +3188,7 @@ TIFFReadDirEntryCheckRangeLongLong8(uint64 value) |
static enum TIFFReadDirEntryErr |
TIFFReadDirEntryCheckRangeLongSlong8(int64 value) |
{ |
- if ((value<0) || (value > TIFF_UINT32_MAX)) |
+ if ((value < 0) || (value > (int64) TIFF_UINT32_MAX)) |
return(TIFFReadDirEntryErrRange); |
else |
return(TIFFReadDirEntryErrOk); |
@@ -3229,19 +3205,21 @@ TIFFReadDirEntryCheckRangeSlongLong(uint32 value) |
return(TIFFReadDirEntryErrOk); |
} |
+/* Check that the 8-byte unsigned value can fit in a 4-byte unsigned range */ |
static enum TIFFReadDirEntryErr |
TIFFReadDirEntryCheckRangeSlongLong8(uint64 value) |
{ |
- if (value > 0x7FFFFFFFUL) |
+ if (value > 0x7FFFFFFF) |
return(TIFFReadDirEntryErrRange); |
else |
return(TIFFReadDirEntryErrOk); |
} |
+/* Check that the 8-byte signed value can fit in a 4-byte signed range */ |
static enum TIFFReadDirEntryErr |
TIFFReadDirEntryCheckRangeSlongSlong8(int64 value) |
{ |
- if ((value < 0L-0x80000000L) || (value > 0x7FFFFFFFL)) |
+ if ((value < 0-((int64) 0x7FFFFFFF+1)) || (value > 0x7FFFFFFF)) |
return(TIFFReadDirEntryErrRange); |
else |
return(TIFFReadDirEntryErrOk); |
@@ -3286,11 +3264,7 @@ TIFFReadDirEntryCheckRangeLong8Slong8(int64 value) |
/* |
* Largest 64-bit signed integer value. |
*/ |
-#if defined(__WIN32__) && defined(_MSC_VER) |
-# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFI64 |
-#else |
-# define TIFF_INT64_MAX 0x7FFFFFFFFFFFFFFFLL |
-#endif |
+#define TIFF_INT64_MAX ((int64)(((uint64) ~0) >> 1)) |
static enum TIFFReadDirEntryErr |
TIFFReadDirEntryCheckRangeSlong8Long8(uint64 value) |
@@ -3374,7 +3348,7 @@ static void TIFFReadDirEntryOutputErr(TIFF* tif, enum TIFFReadDirEntryErr err, c |
} else { |
switch (err) { |
case TIFFReadDirEntryErrCount: |
- TIFFErrorExt(tif->tif_clientdata, module, |
+ TIFFWarningExt(tif->tif_clientdata, module, |
"Incorrect count for \"%s\"; tag ignored", |
tagname); |
break; |
@@ -3430,6 +3404,8 @@ TIFFReadDirectory(TIFF* tif) |
const TIFFField* fip; |
uint32 fii=FAILED_FII; |
toff_t nextdiroff; |
+ int bitspersample_read = FALSE; |
+ |
tif->tif_diroff=tif->tif_nextdiroff; |
if (!TIFFCheckDirOffset(tif,tif->tif_nextdiroff)) |
return 0; /* last offset or bad offset (IFD looping) */ |
@@ -3706,6 +3682,8 @@ TIFFReadDirectory(TIFF* tif) |
} |
if (!TIFFSetField(tif,dp->tdir_tag,value)) |
goto bad; |
+ if( dp->tdir_tag == TIFFTAG_BITSPERSAMPLE ) |
+ bitspersample_read = TRUE; |
} |
break; |
case TIFFTAG_SMINSAMPLEVALUE: |
@@ -3763,6 +3741,19 @@ TIFFReadDirectory(TIFF* tif) |
uint32 countrequired; |
uint32 incrementpersample; |
uint16* value=NULL; |
+ /* It would be dangerous to instanciate those tag values */ |
+ /* since if td_bitspersample has not yet been read (due to */ |
+ /* unordered tags), it could be read afterwards with a */ |
+ /* values greater than the default one (1), which may cause */ |
+ /* crashes in user code */ |
+ if( !bitspersample_read ) |
+ { |
+ fip = TIFFFieldWithTag(tif,dp->tdir_tag); |
+ TIFFWarningExt(tif->tif_clientdata,module, |
+ "Ignoring %s since BitsPerSample tag not found", |
+ fip ? fip->field_name : "unknown tagname"); |
+ continue; |
+ } |
countpersample=(1L<<tif->tif_dir.td_bitspersample); |
if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample)) |
{ |
@@ -4278,7 +4269,8 @@ EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount) |
TIFFDirectory *td = &tif->tif_dir; |
uint32 strip; |
- _TIFFFillStriles( tif ); |
+ if( !_TIFFFillStriles( tif ) ) |
+ return -1; |
if (td->td_stripbytecount) |
_TIFFfree(td->td_stripbytecount); |
@@ -4377,6 +4369,11 @@ TIFFCheckDirOffset(TIFF* tif, uint64 diroff) |
if (diroff == 0) /* no more directories */ |
return 0; |
+ if (tif->tif_dirnumber == 65535) { |
+ TIFFErrorExt(tif->tif_clientdata, "TIFFCheckDirOffset", |
+ "Cannot handle more than 65535 TIFF directories"); |
+ return 0; |
+ } |
for (n = 0; n < tif->tif_dirnumber && tif->tif_dirlist; n++) { |
if (tif->tif_dirlist[n] == diroff) |
@@ -4396,7 +4393,10 @@ TIFFCheckDirOffset(TIFF* tif, uint64 diroff) |
tif->tif_dirnumber, 2 * sizeof(uint64), "for IFD list"); |
if (!new_dirlist) |
return 0; |
- tif->tif_dirlistsize = 2 * tif->tif_dirnumber; |
+ if( tif->tif_dirnumber >= 32768 ) |
+ tif->tif_dirlistsize = 65535; |
+ else |
+ tif->tif_dirlistsize = 2 * tif->tif_dirnumber; |
tif->tif_dirlist = new_dirlist; |
} |
@@ -4708,6 +4708,7 @@ TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover) |
return 0; |
} |
fip=tif->tif_fields[fii]; |
+ assert(fip != NULL); /* should not happen */ |
assert(fip->set_field_type!=TIFF_SETGET_OTHER); /* if so, we shouldn't arrive here but deal with this in specialized code */ |
assert(fip->set_field_type!=TIFF_SETGET_INT); /* if so, we shouldn't arrive here as this is only the case for pseudo-tags */ |
err=TIFFReadDirEntryErrOk; |
@@ -5355,7 +5356,7 @@ TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp, int recover) |
} |
if (err!=TIFFReadDirEntryErrOk) |
{ |
- TIFFReadDirEntryOutputErr(tif,err,module,fip ? fip->field_name : "unknown tagname",recover); |
+ TIFFReadDirEntryOutputErr(tif,err,module,fip->field_name,recover); |
return(0); |
} |
return(1); |
@@ -5611,4 +5612,3 @@ int _TIFFFillStriles( TIFF *tif ) |
* fill-column: 78 |
* End: |
*/ |
- |