From 87d39ea1b96edb719022188ab8d5215721c5c416 Mon Sep 17 00:00:00 2001
From: Even Rouault <[EMAIL REDACTED]>
Date: Mon, 22 Apr 2024 18:10:54 +0000
Subject: [PATCH] EvaluateIFDdatasizeReading(): avoid potential unsigned
integer overflow on corrupted tag
---
libtiff/tif_dirread.c | 287 +++++++++++++++++++++++++++++++++++-------
1 file changed, 240 insertions(+), 47 deletions(-)
diff --git a/libtiff/tif_dirread.c b/libtiff/tif_dirread.c
index 8f57e1b9..70074c73 100644
--- a/libtiff/tif_dirread.c
+++ b/libtiff/tif_dirread.c
@@ -4081,9 +4081,16 @@ static int ByteCountLooksBad(TIFF *tif)
* To evaluate the IFD data size when reading, save the offset and data size of
* all data that does not fit into the IFD entries themselves.
*/
-static void EvaluateIFDdatasizeReading(TIFF *tif, TIFFDirEntry *dp)
+static bool EvaluateIFDdatasizeReading(TIFF *tif, TIFFDirEntry *dp)
{
- uint64_t datalength = dp->tdir_count * TIFFDataWidth(dp->tdir_type);
+ const uint64_t data_width = TIFFDataWidth(dp->tdir_type);
+ if (data_width != 0 && dp->tdir_count > UINT64_MAX / data_width)
+ {
+ TIFFErrorExtR(tif, "EvaluateIFDdatasizeReading",
+ "Too large IFD data size");
+ return false;
+ }
+ const uint64_t datalength = dp->tdir_count * data_width;
if (datalength > ((tif->tif_flags & TIFF_BIGTIFF) ? 0x8U : 0x4U))
{
tif->tif_dir.td_dirdatasize_read += datalength;
@@ -4115,6 +4122,7 @@ static void EvaluateIFDdatasizeReading(TIFF *tif, TIFFDirEntry *dp)
.length = datalength;
tif->tif_dir.td_dirdatasize_Noffsets++;
}
+ return true;
}
/*
@@ -4509,7 +4517,8 @@ int TIFFReadDirectory(TIFF *tif)
uint16_t value;
enum TIFFReadDirEntryErr err;
err = TIFFReadDirEntryShort(tif, dp, &value);
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ goto bad;
if (err == TIFFReadDirEntryErrCount)
err =
TIFFReadDirEntryPersampleShort(tif, dp, &value);
@@ -4540,7 +4549,8 @@ int TIFFReadDirectory(TIFF *tif)
err = TIFFReadDirEntryErrCount;
else
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ goto bad;
if (err != TIFFReadDirEntryErrOk)
{
fip = TIFFFieldWithTag(tif, dp->tdir_tag);
@@ -4583,7 +4593,8 @@ int TIFFReadDirectory(TIFF *tif)
}
_TIFFmemcpy(&(tif->tif_dir.td_stripoffset_entry), dp,
sizeof(TIFFDirEntry));
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ goto bad;
}
break;
case TIFFTAG_STRIPBYTECOUNTS:
@@ -4611,7 +4622,8 @@ int TIFFReadDirectory(TIFF *tif)
}
_TIFFmemcpy(&(tif->tif_dir.td_stripbytecount_entry), dp,
sizeof(TIFFDirEntry));
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ goto bad;
}
break;
case TIFFTAG_COLORMAP:
@@ -4667,7 +4679,8 @@ int TIFFReadDirectory(TIFF *tif)
err = TIFFReadDirEntryErrCount;
else
err = TIFFReadDirEntryShortArray(tif, dp, &value);
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ goto bad;
if (err != TIFFReadDirEntryErrOk)
{
fip = TIFFFieldWithTag(tif, dp->tdir_tag);
@@ -6266,7 +6279,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
}
}
}
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != NULL)
+ _TIFFfreeExt(tif, data);
+ return (0);
+ }
if (mb + 1 < (uint32_t)dp->tdir_count)
TIFFWarningExtR(
tif, module,
@@ -6394,7 +6412,8 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLong8(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ return 0;
if (!TIFFSetField(tif, dp->tdir_tag, data))
return (0);
}
@@ -6408,7 +6427,8 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlong8(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ return 0;
if (!TIFFSetField(tif, dp->tdir_tag, data))
return (0);
}
@@ -6422,7 +6442,8 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryFloat(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ return 0;
if (!TIFFSetField(tif, dp->tdir_tag, data))
return (0);
}
@@ -6436,7 +6457,8 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryDouble(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ return 0;
if (!TIFFSetField(tif, dp->tdir_tag, data))
return (0);
}
@@ -6450,7 +6472,8 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryIfd8(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ return 0;
if (!TIFFSetField(tif, dp->tdir_tag, data))
return (0);
}
@@ -6500,7 +6523,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryByteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6530,7 +6558,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6560,7 +6593,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryShortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6590,7 +6628,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySshortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6620,7 +6663,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6650,7 +6698,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6680,7 +6733,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6710,7 +6768,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6740,7 +6803,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryFloatArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6772,7 +6840,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, data);
if (data != 0)
@@ -6795,7 +6868,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryByteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
if (data != 0 && dp->tdir_count > 0 &&
data[dp->tdir_count - 1] != '\0')
@@ -6846,7 +6924,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryByteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6870,7 +6953,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6894,7 +6982,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryShortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6918,7 +7011,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySshortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6942,7 +7040,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6966,7 +7069,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -6990,7 +7098,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -7014,7 +7127,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -7038,7 +7156,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryFloatArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -7062,7 +7185,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -7086,7 +7214,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag,
(uint16_t)(dp->tdir_count), data);
@@ -7106,7 +7239,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryByteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
if (data != 0 && dp->tdir_count > 0 &&
data[dp->tdir_count - 1] != '\0')
@@ -7177,7 +7315,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
}
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, count, data);
if (data != 0)
@@ -7195,7 +7338,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySbyteArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7214,7 +7362,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryShortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7233,7 +7386,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySshortArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7252,7 +7410,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7271,7 +7434,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlongArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7290,7 +7458,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryLong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7309,7 +7482,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntrySlong8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7328,7 +7506,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryFloatArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7347,7 +7530,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryDoubleArray(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);
@@ -7366,7 +7554,12 @@ static int TIFFFetchNormalTag(TIFF *tif, TIFFDirEntry *dp, int recover)
err = TIFFReadDirEntryIfd8Array(tif, dp, &data);
if (err == TIFFReadDirEntryErrOk)
{
- EvaluateIFDdatasizeReading(tif, dp);
+ if (!EvaluateIFDdatasizeReading(tif, dp))
+ {
+ if (data != 0)
+ _TIFFfreeExt(tif, data);
+ return 0;
+ }
int m;
m = TIFFSetField(tif, dp->tdir_tag, (uint32_t)(dp->tdir_count),
data);