diff options
author | Even Rouault <even.rouault@spatialys.com> | 2023-01-09 18:11:33 +0000 |
---|---|---|
committer | Even Rouault <even.rouault@spatialys.com> | 2023-01-09 18:11:33 +0000 |
commit | 9ce5083225b16081645bbc38c7d7d7f12b3fdf65 (patch) | |
tree | dde9f1db26b1323d868a0b0eee178d0a6217ff65 | |
parent | 9f84326b1394fd9efae2f33bf39218a307d1d87e (diff) | |
parent | c074eb73d3b0618ecb9d95941bc82a39de727e1c (diff) | |
download | libtiff-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.c | 21 | ||||
-rw-r--r-- | libtiff/tif_dir.c | 4 | ||||
-rw-r--r-- | libtiff/tif_dirread.c | 12 | ||||
-rw-r--r-- | libtiff/tif_hash_set.c | 2 | ||||
-rw-r--r-- | libtiff/tif_hash_set.h | 4 | ||||
-rw-r--r-- | libtiff/tif_open.c | 1 | ||||
-rw-r--r-- | libtiff/tiffiop.h | 11 |
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, |