libtiff: Add a TIFF_MAX_DIR_COUNT public #define

From 0530835da45a8b7dd11a1251425a6b5a74639a3a Mon Sep 17 00:00:00 2001
From: Even Rouault <[EMAIL REDACTED]>
Date: Mon, 12 Dec 2022 21:20:59 +0100
Subject: [PATCH] Add a TIFF_MAX_DIR_COUNT public #define

---
 libtiff/tif_dirread.c | 13 ++++++++-----
 libtiff/tiffio.h      |  5 +++++
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/libtiff/tif_dirread.c b/libtiff/tif_dirread.c
index e2f563eb..799dbc5a 100644
--- a/libtiff/tif_dirread.c
+++ b/libtiff/tif_dirread.c
@@ -4079,7 +4079,8 @@ int TIFFReadDirectory(TIFF *tif)
             tif, tif->tif_curdir == 0xFFFFFFFFU ? 0 : tif->tif_curdir + 1,
             nextdiroff))
     {
-        return 0; /* bad offset (IFD looping or more than 1048576 IFDs) */
+        return 0; /* bad offset (IFD looping or more than TIFF_MAX_DIR_COUNT
+                     IFDs) */
     }
     dircount = TIFFFetchDirectory(tif, nextdiroff, &dir, &tif->tif_nextdiroff);
     if (!dircount)
@@ -5397,10 +5398,11 @@ int _TIFFCheckDirNumberAndOffset(TIFF *tif, tdir_t dirn, uint64_t diroff)
     }
 
     /* Arbitrary (hopefully big enough) limit */
-    if (tif->tif_dirnumber >= 1048576)
+    if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
     {
         TIFFErrorExtR(tif, "_TIFFCheckDirNumberAndOffset",
-                      "Cannot handle more than 1048576 TIFF directories");
+                      "Cannot handle more than %u TIFF directories",
+                      TIFF_MAX_DIR_COUNT);
         return 0;
     }
 
@@ -5447,10 +5449,11 @@ int _TIFFGetDirNumberFromOffset(TIFF *tif, uint64_t diroff, tdir_t *dirn)
 {
     if (diroff == 0) /* no more directories */
         return 0;
-    if (tif->tif_dirnumber >= 1048576)
+    if (tif->tif_dirnumber >= TIFF_MAX_DIR_COUNT)
     {
         TIFFErrorExtR(tif, "_TIFFGetDirNumberFromOffset",
-                      "Cannot handle more than 1048576 TIFF directories");
+                      "Cannot handle more than %u TIFF directories",
+                      TIFF_MAX_DIR_COUNT);
         return 0;
     }
 
diff --git a/libtiff/tiffio.h b/libtiff/tiffio.h
index 4df57665..c6cb7779 100644
--- a/libtiff/tiffio.h
+++ b/libtiff/tiffio.h
@@ -277,6 +277,11 @@ typedef struct
 #define TIFF_ATTRIBUTE(x) /*nothing*/
 #endif
 
+/** Maximum number of TIFF IFDs that libtiff can iterate through in a file. */
+#ifndef TIFF_MAX_DIR_COUNT
+#define TIFF_MAX_DIR_COUNT 1048576
+#endif
+
 #if defined(c_plusplus) || defined(__cplusplus)
 extern "C"
 {