libtiff: Add _TIFFCleanupIFDOffsetAndNumberMaps() and call it from TIFFUnlinkDirectory()

From 4eea4d5d934f4d59e676085274bbbc5439cfc80e Mon Sep 17 00:00:00 2001
From: Even Rouault <[EMAIL REDACTED]>
Date: Fri, 6 Jan 2023 00:33:09 +0100
Subject: [PATCH] Add _TIFFCleanupIFDOffsetAndNumberMaps() and call it from
 TIFFUnlinkDirectory()

---
 libtiff/tif_close.c | 21 +++++++++++++++++++--
 libtiff/tif_dir.c   |  2 ++
 libtiff/tiffiop.h   |  2 ++
 3 files changed, 23 insertions(+), 2 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.
@@ -114,6 +113,24 @@ void TIFFCleanup(TIFF *tif)
     _TIFFfreeExt(NULL, 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..804ed6f9 100644
--- a/libtiff/tif_dir.c
+++ b/libtiff/tif_dir.c
@@ -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/tiffiop.h b/libtiff/tiffiop.h
index 791881a3..bf8afb2a 100644
--- a/libtiff/tiffiop.h
+++ b/libtiff/tiffiop.h
@@ -444,6 +444,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,