summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2022-12-13 15:15:18 +0100
committerEven Rouault <even.rouault@spatialys.com>2022-12-13 15:19:46 +0100
commit565b8923affdc0851d85eafe63a048a58bf1a60b (patch)
treeffbd6567e8bca148699cffd285d98d8985199b4c
parent2c0f2ed803c84ec9244236c59dacf4dc32447ecc (diff)
downloadlibtiff-git-565b8923affdc0851d85eafe63a048a58bf1a60b.tar.gz
Add tests for IFD loop detection
-rw-r--r--test/CMakeLists.txt6
-rw-r--r--test/Makefile.am8
-rw-r--r--test/images/test_ifd_loop_to_first.tifbin0 -> 312 bytes
-rw-r--r--test/images/test_ifd_loop_to_self.tifbin0 -> 558 bytes
-rw-r--r--test/images/test_two_ifds.tifbin0 -> 312 bytes
-rw-r--r--test/test_ifd_loop_detection.c179
6 files changed, 192 insertions, 1 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 742aba5b..907aed8f 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -185,6 +185,12 @@ target_sources(test_append_to_strip PRIVATE test_append_to_strip.c)
target_link_libraries(test_append_to_strip PRIVATE tiff tiff_port)
list(APPEND simple_tests test_append_to_strip)
+add_executable(test_ifd_loop_detection ../placeholder.h)
+target_sources(test_ifd_loop_detection PRIVATE test_ifd_loop_detection.c)
+target_link_libraries(test_ifd_loop_detection PRIVATE tiff tiff_port)
+target_compile_definitions(test_ifd_loop_detection PRIVATE SOURCE_DIR=\"${CMAKE_CURRENT_SOURCE_DIR}\")
+list(APPEND simple_tests test_ifd_loop_detection)
+
if(WEBP_SUPPORT AND EMSCRIPTEN)
# Emscripten is pretty finnicky about linker flags.
# It needs --shared-memory if and only if atomics or bulk-memory is used.
diff --git a/test/Makefile.am b/test/Makefile.am
index f7c2477e..4ba5e07c 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -76,7 +76,7 @@ if TIFF_TESTS
check_PROGRAMS = \
ascii_tag long_tag short_tag strip_rw rewrite custom_dir custom_dir_EXIF_231 \
defer_strile_loading defer_strile_writing test_directory test_open_options \
- test_append_to_strip testtypes test_signed_tags $(JPEG_DEPENDENT_CHECK_PROG) $(STATIC_CHECK_PROGS)
+ test_append_to_strip test_ifd_loop_detection testtypes test_signed_tags $(JPEG_DEPENDENT_CHECK_PROG) $(STATIC_CHECK_PROGS)
endif
# Test scripts to execute
@@ -210,6 +210,9 @@ IMAGES_EXTRA_DIST = \
images/test_float64_predictor2_le_lzw.tif \
images/test_float64_predictor2_be_lzw.tif \
images/tiff_with_subifd_chain.tif \
+ images/test_ifd_loop_to_self.tif \
+ images/test_ifd_loop_to_first.tif \
+ images/test_two_ifds.tif \
$(PNMIMAGES) \
$(TIFFIMAGES)
@@ -250,6 +253,9 @@ test_open_options_SOURCES = test_open_options.c
test_open_options_LDADD = $(LIBTIFF)
test_append_to_strip_SOURCES = test_append_to_strip.c
test_append_to_strip_LDADD = $(LIBTIFF)
+test_ifd_loop_detection_CFLAGS = -DSOURCE_DIR=\"@srcdir@\"
+test_ifd_loop_detection_SOURCES = test_ifd_loop_detection.c
+test_ifd_loop_detection_LDADD = $(LIBTIFF)
AM_CPPFLAGS = -I$(top_srcdir)/libtiff
diff --git a/test/images/test_ifd_loop_to_first.tif b/test/images/test_ifd_loop_to_first.tif
new file mode 100644
index 00000000..015c8d90
--- /dev/null
+++ b/test/images/test_ifd_loop_to_first.tif
Binary files differ
diff --git a/test/images/test_ifd_loop_to_self.tif b/test/images/test_ifd_loop_to_self.tif
new file mode 100644
index 00000000..26b585e9
--- /dev/null
+++ b/test/images/test_ifd_loop_to_self.tif
Binary files differ
diff --git a/test/images/test_two_ifds.tif b/test/images/test_two_ifds.tif
new file mode 100644
index 00000000..4334649e
--- /dev/null
+++ b/test/images/test_two_ifds.tif
Binary files differ
diff --git a/test/test_ifd_loop_detection.c b/test/test_ifd_loop_detection.c
new file mode 100644
index 00000000..52b089bf
--- /dev/null
+++ b/test/test_ifd_loop_detection.c
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2022, Even Rouault <even.rouault at spatialys.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Test IFD loop detection
+ */
+
+#include "tif_config.h"
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "tiffio.h"
+
+int main()
+{
+ int ret = 0;
+ {
+ TIFF *tif =
+ TIFFOpen(SOURCE_DIR "/images/test_ifd_loop_to_self.tif", "r");
+ assert(tif);
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(1) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ {
+ TIFF *tif =
+ TIFFOpen(SOURCE_DIR "/images/test_ifd_loop_to_self.tif", "r");
+ assert(tif);
+ int n = TIFFNumberOfDirectories(tif);
+ if (n != 1)
+ {
+ fprintf(
+ stderr,
+ "(2) Expected TIFFNumberOfDirectories() to return 1. Got %d\n",
+ n);
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ {
+ TIFF *tif =
+ TIFFOpen(SOURCE_DIR "/images/test_ifd_loop_to_first.tif", "r");
+ assert(tif);
+ if (TIFFReadDirectory(tif) != 1)
+ {
+ fprintf(stderr, "(3) Expected TIFFReadDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(4) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ if (TIFFSetDirectory(tif, 1) != 1)
+ {
+ fprintf(stderr, "(5) Expected TIFFSetDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(6) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ if (TIFFSetDirectory(tif, 0) != 1)
+ {
+ fprintf(stderr, "(7) Expected TIFFSetDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif) != 1)
+ {
+ fprintf(stderr, "(8) Expected TIFFReadDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(9) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ {
+ TIFF *tif =
+ TIFFOpen(SOURCE_DIR "/images/test_ifd_loop_to_first.tif", "r");
+ assert(tif);
+ int n = TIFFNumberOfDirectories(tif);
+ if (n != 2)
+ {
+ fprintf(
+ stderr,
+ "(10) Expected TIFFNumberOfDirectories() to return 2. Got %d\n",
+ n);
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ {
+ TIFF *tif = TIFFOpen(SOURCE_DIR "/images/test_two_ifds.tif", "r");
+ assert(tif);
+ if (TIFFReadDirectory(tif) != 1)
+ {
+ fprintf(stderr, "(11) Expected TIFFReadDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(12) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ if (TIFFSetDirectory(tif, 1) != 1)
+ {
+ fprintf(stderr, "(13) Expected TIFFSetDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(14) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ if (TIFFSetDirectory(tif, 0) != 1)
+ {
+ fprintf(stderr, "(15) Expected TIFFSetDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif) != 1)
+ {
+ fprintf(stderr, "(16) Expected TIFFReadDirectory() to succeed\n");
+ ret = 1;
+ }
+ if (TIFFReadDirectory(tif))
+ {
+ fprintf(stderr, "(17) Expected TIFFReadDirectory() to fail\n");
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ {
+ TIFF *tif = TIFFOpen(SOURCE_DIR "/images/test_two_ifds.tif", "r");
+ assert(tif);
+ int n = TIFFNumberOfDirectories(tif);
+ if (n != 2)
+ {
+ fprintf(
+ stderr,
+ "(18) Expected TIFFNumberOfDirectories() to return 2. Got %d\n",
+ n);
+ ret = 1;
+ }
+ TIFFClose(tif);
+ }
+ return ret;
+}