summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2023-01-09 18:11:33 +0000
committerEven Rouault <even.rouault@spatialys.com>2023-01-09 18:11:33 +0000
commit9ce5083225b16081645bbc38c7d7d7f12b3fdf65 (patch)
treedde9f1db26b1323d868a0b0eee178d0a6217ff65
parent9f84326b1394fd9efae2f33bf39218a307d1d87e (diff)
parentc074eb73d3b0618ecb9d95941bc82a39de727e1c (diff)
downloadlibtiff-git-9ce5083225b16081645bbc38c7d7d7f12b3fdf65.tar.gz
Merge branch '_TIFFCleanupIFDOffsetAndNumberMaps' into 'master'
Add _TIFFCleanupIFDOffsetAndNumberMaps() and call it from TIFFUnlinkDirectory() See merge request libtiff/libtiff!454
-rw-r--r--libtiff/tif_close.c21
-rw-r--r--libtiff/tif_dir.c4
-rw-r--r--libtiff/tif_dirread.c12
-rw-r--r--libtiff/tif_hash_set.c2
-rw-r--r--libtiff/tif_hash_set.h4
-rw-r--r--libtiff/tif_open.c1
-rw-r--r--libtiff/tiffiop.h11
7 files changed, 31 insertions, 24 deletions
diff --git a/libtiff/tif_close.c b/libtiff/tif_close.c
index 06aa29f5..985d290c 100644
--- a/libtiff/tif_close.c
+++ b/libtiff/tif_close.c
@@ -51,8 +51,7 @@ void TIFFCleanup(TIFF *tif)
(*tif->tif_cleanup)(tif);
TIFFFreeDirectory(tif);
- TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
- TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif);
/*
* Clean up client info links.
@@ -115,6 +114,24 @@ void TIFFCleanup(TIFF *tif)
}
/************************************************************************/
+/* _TIFFCleanupIFDOffsetAndNumberMaps() */
+/************************************************************************/
+
+void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif)
+{
+ if (tif->tif_map_dir_offset_to_number)
+ {
+ TIFFHashSetDestroy(tif->tif_map_dir_offset_to_number);
+ tif->tif_map_dir_offset_to_number = NULL;
+ }
+ if (tif->tif_map_dir_number_to_offset)
+ {
+ TIFFHashSetDestroy(tif->tif_map_dir_number_to_offset);
+ tif->tif_map_dir_number_to_offset = NULL;
+ }
+}
+
+/************************************************************************/
/* TIFFClose() */
/************************************************************************/
diff --git a/libtiff/tif_dir.c b/libtiff/tif_dir.c
index c7789bb8..8c275e04 100644
--- a/libtiff/tif_dir.c
+++ b/libtiff/tif_dir.c
@@ -2104,7 +2104,7 @@ int TIFFSetSubDirectory(TIFF *tif, uint64_t diroff)
{
/* Reset IFD list to start new one for SubIFD chain and also start
* SubIFD chain with tif_curdir=0. */
- tif->tif_dirnumber = 0;
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif); /* invalidate IFD loop lists */
tif->tif_curdir = 0; /* first directory of new chain */
/* add this offset to new IFD list */
_TIFFCheckDirNumberAndOffset(tif, tif->tif_curdir, diroff);
@@ -2231,5 +2231,7 @@ int TIFFUnlinkDirectory(TIFF *tif, tdir_t dirn)
tif->tif_curoff = 0;
tif->tif_row = (uint32_t)-1;
tif->tif_curstrip = (uint32_t)-1;
+ tif->tif_curdir = TIFF_NON_EXISTENT_DIR_NUMBER;
+ _TIFFCleanupIFDOffsetAndNumberMaps(tif);
return (1);
}
diff --git a/libtiff/tif_dirread.c b/libtiff/tif_dirread.c
index 35425b4b..ef21f7f5 100644
--- a/libtiff/tif_dirread.c
+++ b/libtiff/tif_dirread.c
@@ -5448,7 +5448,8 @@ int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn, uint64_t diroff)
}
/* Arbitrary (hopefully big enough) limit */
- if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
+ if (TIFFHashSetSize(tif->tif_map_dir_offset_to_number) >=
+ TIFF_MAX_DIR_COUNT)
{
TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
"Cannot handle more than %u TIFF directories",
@@ -5481,8 +5482,6 @@ int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn, uint64_t diroff)
return 0;
}
- tif->tif_dirnumber++;
-
return 1;
} /* --- _TIFFCheckDirNumberAndOffset() ---*/
@@ -5497,13 +5496,6 @@ int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff, tdir_t *dirn)
{
if (diroff == 0) /* no more directories */
return 0;
- if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
- {
- TIFFErrorExtR(tif, "_TIFFGetDirNumberFromOffset",
- "Cannot handle more than %u TIFF directories",
- TIFF_MAX_DIR_COUNT);
- return 0;
- }
/* Check if offset is already in the list and return matching directory
* number. Otherwise update IFD list using TIFFNumberOfDirectories() and
diff --git a/libtiff/tif_hash_set.c b/libtiff/tif_hash_set.c
index 37adf61a..22f05d03 100644
--- a/libtiff/tif_hash_set.c
+++ b/libtiff/tif_hash_set.c
@@ -162,7 +162,6 @@ TIFFHashSet *TIFFHashSetNew(TIFFHashSetHashFunc fnHashFunc,
return set;
}
-#ifdef notdef
/************************************************************************/
/* TIFFHashSetSize() */
/************************************************************************/
@@ -182,7 +181,6 @@ int TIFFHashSetSize(const TIFFHashSet *set)
assert(set != NULL);
return set->nSize;
}
-#endif
/************************************************************************/
/* TIFFHashSetGetNewListElt() */
diff --git a/libtiff/tif_hash_set.h b/libtiff/tif_hash_set.h
index 1a3f8da6..f60e2c67 100644
--- a/libtiff/tif_hash_set.h
+++ b/libtiff/tif_hash_set.h
@@ -71,11 +71,11 @@ extern "C"
void TIFFHashSetDestroy(TIFFHashSet *set);
+ int TIFFHashSetSize(const TIFFHashSet *set);
+
#ifdef notused
void TIFFHashSetClear(TIFFHashSet *set);
- int TIFFHashSetSize(const TIFFHashSet *set);
-
/** TIFFHashSetIterEltFunc */
typedef int (*TIFFHashSetIterEltFunc)(void *elt, void *user_data);
diff --git a/libtiff/tif_open.c b/libtiff/tif_open.c
index 8a86a269..e84ef6d2 100644
--- a/libtiff/tif_open.c
+++ b/libtiff/tif_open.c
@@ -485,7 +485,6 @@ TIFF *TIFFClientOpenExt(const char *name, const char *mode,
goto bad;
tif->tif_diroff = 0;
tif->tif_lastdiroff = 0;
- tif->tif_dirnumber = 0;
return (tif);
}
/*
diff --git a/libtiff/tiffiop.h b/libtiff/tiffiop.h
index 791881a3..c419608d 100644
--- a/libtiff/tiffiop.h
+++ b/libtiff/tiffiop.h
@@ -143,14 +143,11 @@ struct tiff
#define TIFF_CHOPPEDUPARRAYS \
0x4000000U /* set when allocChoppedUpStripArrays() has modified strip \
array */
- uint64_t tif_diroff; /* file offset of current directory */
- uint64_t tif_nextdiroff; /* file offset of following directory */
- uint64_t tif_lastdiroff; /* file offset of last directory written so far */
- uint64_t *tif_dirlistoff; /* list of offsets to already seen directories to
- prevent IFD looping */
+ uint64_t tif_diroff; /* file offset of current directory */
+ uint64_t tif_nextdiroff; /* file offset of following directory */
+ uint64_t tif_lastdiroff; /* file offset of last directory written so far */
TIFFHashSet *tif_map_dir_offset_to_number;
TIFFHashSet *tif_map_dir_number_to_offset;
- tdir_t tif_dirnumber; /* number of already seen directories */
TIFFDirectory tif_dir; /* internal rep of current directory */
TIFFDirectory
tif_customdir; /* custom IFDs are separated from the main ones */
@@ -444,6 +441,8 @@ extern "C"
extern float _TIFFClampDoubleToFloat(double);
extern uint32_t _TIFFClampDoubleToUInt32(double);
+ extern void _TIFFCleanupIFDOffsetAndNumberMaps(TIFF *tif);
+
extern tmsize_t _TIFFReadEncodedStripAndAllocBuffer(TIFF *tif,
uint32_t strip,
void **buf,