Skip to content

Commit

Permalink
Add tests for IFD loop detection
Browse files Browse the repository at this point in the history
  • Loading branch information
rouault committed Dec 13, 2022
1 parent 2c0f2ed commit 565b892
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 1 deletion.
6 changes: 6 additions & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
8 changes: 7 additions & 1 deletion test/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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

Expand Down
Binary file added test/images/test_ifd_loop_to_first.tif
Binary file not shown.
Binary file added test/images/test_ifd_loop_to_self.tif
Binary file not shown.
Binary file added test/images/test_two_ifds.tif
Binary file not shown.
179 changes: 179 additions & 0 deletions test/test_ifd_loop_detection.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 565b892

Please sign in to comment.