commit: 9a61d8e9f3e5b6d2e00a081e54b93572268468b6 Author: Sam James <sam <AT> gentoo <DOT> org> AuthorDate: Thu Feb 27 02:55:26 2025 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Thu Feb 27 02:55:26 2025 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=9a61d8e9
media-libs/tiff: fix tests on big-endian Bug: https://bugs.gentoo.org/936572 Bug: https://bugs.gentoo.org/950284 Signed-off-by: Sam James <sam <AT> gentoo.org> .../tiff-4.7.0-test-directory-big-endian.patch | 328 +++++++++++++++++++++ media-libs/tiff/tiff-4.7.0-r1.ebuild | 5 +- 2 files changed, 332 insertions(+), 1 deletion(-) diff --git a/media-libs/tiff/files/tiff-4.7.0-test-directory-big-endian.patch b/media-libs/tiff/files/tiff-4.7.0-test-directory-big-endian.patch new file mode 100644 index 000000000000..0eca0b69954f --- /dev/null +++ b/media-libs/tiff/files/tiff-4.7.0-test-directory-big-endian.patch @@ -0,0 +1,328 @@ +https://gitlab.com/libtiff/libtiff/-/issues/652 +https://gitlab.com/libtiff/libtiff/-/issues/656 +https://gitlab.com/libtiff/libtiff/-/merge_requests/673 + +From 388be62f9e2167ea076579e2605ff8eb91117ad6 Mon Sep 17 00:00:00 2001 +From: Su_Laus <[email protected]> +Date: Wed, 30 Oct 2024 21:03:17 +0100 +Subject: [PATCH 1/3] Update test/test_directory.c not to fail on big-endian + machines. + +Closes #652 +--- a/test/test_directory.c ++++ b/test/test_directory.c +@@ -1986,9 +1986,12 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + #define TIFFSeekFile_M(tif, off, whence) \ + ((*TIFFGetSeekProc(tif))(TIFFClientdata(tif), (off), (whence))); + +- /* Code below does only handle Classic-TIFF without swapping". */ ++ /* Code below does only handle Classic-TIFF without swapping. */ + if (!(TIFFIsByteSwapped(tif) || TIFFIsBigTIFF(tif))) + { ++ /* Patch nextIFDOffset of IFD2, which is 0, with offset to itself. ++ * This generates an IFD3 without any elements at the end of file. ++ * Reading IFD3 should provoke reading error. */ + uint64_t ss = TIFFSeekFile_M(tif, offsetBase[2], 0); + uint16_t cnt = 0; + uint64_t rr = TIFFReadFile_M(tif, &cnt, 2); +@@ -1998,43 +2001,84 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + (void)rr; + + /* Now there are offsets to four IFDs in the file, where the last one is +- * not existing and has a non-valid dircount and entries behind EOF. */ ++ * not existing and has a non-valid dircount and entries behind EOF. ++ * For LE-machines dircount is 458 (as offset) and for BE-machines ++ * dircount is zero. */ ++#ifdef WORDS_BIGENDIAN ++ fprintf(stderr, "----- Expect error messages about 'Error fetching " ++ "directory count.' -----\n"); ++#else + fprintf(stderr, "----- Expect error messages about 'Error fetching " + "directory link.' -----\n"); ++#endif + /* TIFFNumberOfDirectories() returns 3 */ + lastdir = TIFFNumberOfDirectories(tif); + TIFFSetDirectory(tif, 0); + CHECKCURDIRNUM_M(tif, 0, __LINE__); ++ ++ /* TIFFSetDirectory(3) fails with error messages: ++ * TIFFFetchDirectory: test_current_dirnum_incrementing_wl.tif: ++ * Can not read TIFF directory. ++ * TIFFReadDirectory: Failed to read directory at offset 458. */ + fprintf(stderr, "----- Expect error messages about 'Cannot read TIFF " + "directory.' -----\n"); + if (TIFFSetDirectory(tif, 3)) + { + fprintf(stderr, +- "TIFFSetDirectory(3) for IFD4 was expected to fail but " ++ "TIFFSetDirectory(3) for IFD3 was expected to fail but " + "succeeded for %s " + "at %d\n", + filename, __LINE__); + goto failure; + } ++ + /* Fails in 4.6.0 */ + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); + offsetBase[3] = TIFFCurrentDirOffset(tif); + +- /* Point IFD3 to a location within the file, where it has now a +- * non-valid dircount=0. */ ++ /* Point IFD3 to a location within the file, where it has now: ++ * - for LE-machines a non-valid dircount=0. ++ * - for BE-machines a dircount!=0 and dir is read with errors. */ + ss = TIFFSeekFile_M(tif, offsetBase[2] + cnt * 12 + 2, 0); + wt = (uint32_t)(offsetBase[1] + 8); + rr = TIFFWriteFile_M(tif, &wt, 4); ++ ++#ifdef WORDS_BIGENDIAN ++ fprintf(stderr, "----- Expect error messages about 'Error fetching " ++ "directory count.' -----\n"); ++#else + fprintf(stderr, "----- Expect error messages about 'Error fetching " + "directory link.' -----\n"); ++#endif + /* TIFFNumberOfDirectories() returns now 4 */ + lastdir = TIFFNumberOfDirectories(tif); + TIFFSetDirectory(tif, 0); + CHECKCURDIRNUM_M(tif, 0, __LINE__); ++ ++ /* For LE-machines the next TIFFSetDirectory(3) fails with error ++ * messages: ++ * test_current_dirnum_incrementing_wl.tif: Failed to allocate ++ * memory for to read TIFF directory (0 elements of 12 bytes each). ++ * TIFFReadDirectory: Failed to read directory at offset 178. ++ * ++ * For BE-machines, next TIFFSetDirectory(3) results in an error ++ * but that TIFFSetDirectory(3) sets the IFD active. Warning messages: ++ * TIFFReadDirectory: Warning, Unknown field with tag 1 (0x1) ++ * encountered. ++ * MissingRequired: TIFF directory is missing required ++ * "ImageLength" field. ++ */ ++#ifdef WORDS_BIGENDIAN ++ fprintf(stderr, ++ "----- Expect error messages about ' Unknown field with tag 1 " ++ "(0x1) encountered.' AND 'MissingRequired: TIFF directory is " ++ "missing required ImageLength field.' -----\n"); ++#else + fprintf(stderr, + "----- Expect error messages about 'Failed to allocate " + "memory for to read TIFF directory.' AND 'Failed to read " + "directory ..' -----\n"); ++#endif + if (TIFFSetDirectory(tif, 3)) + { + fprintf(stderr, +@@ -2044,8 +2088,13 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + filename, __LINE__); + goto failure; + } ++ + /* Fails in 4.6.0 */ ++#ifdef WORDS_BIGENDIAN ++ CHECKCURDIRNUM_M(tif, (tdir_t)(3), __LINE__); ++#else + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); ++#endif + } + + unlink(filename); +-- +GitLab + + +From e201cd9d944fb18afdb385668008b0eb9d84cc80 Mon Sep 17 00:00:00 2001 +From: Su_Laus <[email protected]> +Date: Sat, 16 Nov 2024 10:33:04 +0100 +Subject: [PATCH 2/3] Replace "#ifdef WORDS_BIGENDIAN" by restricting test on + little-endian TIFF files with swapping of patch data for BE-machines. + +--- a/test/test_directory.c ++++ b/test/test_directory.c +@@ -1977,8 +1977,8 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + TIFFSetSubDirectory(tif, 0); + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); + +-/*-- Patch offset of IFD2 to not existing IFD3 without entries. +- * Thus TIFFFetchDirectory() will fail. --*/ ++ /*-- Patch offset of IFD2 to not existing IFD3 without entries. ++ * Thus TIFFFetchDirectory() will fail. --*/ + #define TIFFReadFile_M(tif, buf, size) \ + ((*TIFFGetReadProc(tif))(TIFFClientdata(tif), (buf), (size))); + #define TIFFWriteFile_M(tif, buf, size) \ +@@ -1986,8 +1986,15 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + #define TIFFSeekFile_M(tif, off, whence) \ + ((*TIFFGetSeekProc(tif))(TIFFClientdata(tif), (off), (whence))); + +- /* Code below does only handle Classic-TIFF without swapping. */ +- if (!(TIFFIsByteSwapped(tif) || TIFFIsBigTIFF(tif))) ++ /* --------------------------------------------------------------------- ++ * Test IFD index incrementing in case the functions return with certain ++ * errors. To provoke that errors, the file is patched by writing bytes ++ * directly into the file. Therefore, code below does only handle ++ * Classic-TIFF and little-endian files. ++ * The code works also on big endian machines, which have to swap some ++ * directly read/written values. ++ * --------------------------------------------------------------------- */ ++ if (!(TIFFIsBigEndian(tif) || TIFFIsBigTIFF(tif))) + { + /* Patch nextIFDOffset of IFD2, which is 0, with offset to itself. + * This generates an IFD3 without any elements at the end of file. +@@ -1995,23 +2002,22 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + uint64_t ss = TIFFSeekFile_M(tif, offsetBase[2], 0); + uint16_t cnt = 0; + uint64_t rr = TIFFReadFile_M(tif, &cnt, 2); ++ if (TIFFIsByteSwapped(tif)) ++ TIFFSwabShort(&cnt); + ss = TIFFSeekFile_M(tif, offsetBase[2] + cnt * 12 + 2, 0); + uint32_t wt = (uint32_t)ss; ++ if (TIFFIsByteSwapped(tif)) ++ TIFFSwabLong(&wt); + rr = TIFFWriteFile_M(tif, &wt, 4); + (void)rr; + + /* Now there are offsets to four IFDs in the file, where the last one is + * not existing and has a non-valid dircount and entries behind EOF. +- * For LE-machines dircount is 458 (as offset) and for BE-machines +- * dircount is zero. */ +-#ifdef WORDS_BIGENDIAN +- fprintf(stderr, "----- Expect error messages about 'Error fetching " +- "directory count.' -----\n"); +-#else ++ * (dircount is 458 (as offset) */ + fprintf(stderr, "----- Expect error messages about 'Error fetching " + "directory link.' -----\n"); +-#endif +- /* TIFFNumberOfDirectories() returns 3 */ ++ /* TIFFNumberOfDirectories() returns 3 and omits the invalid fourth IFD. ++ */ + lastdir = TIFFNumberOfDirectories(tif); + TIFFSetDirectory(tif, 0); + CHECKCURDIRNUM_M(tif, 0, __LINE__); +@@ -2033,52 +2039,41 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + } + + /* Fails in 4.6.0 */ ++ /* Reading invalid IFD 3 leads to an error and was not read in. ++ * Therefore, curdir shall be 65535 (non-existing directory) */ + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); + offsetBase[3] = TIFFCurrentDirOffset(tif); + +- /* Point IFD3 to a location within the file, where it has now: +- * - for LE-machines a non-valid dircount=0. +- * - for BE-machines a dircount!=0 and dir is read with errors. */ ++ /* Point IFD3 to a location within the file, where it has now for ++ * little-endian TIFF files a non-valid dircount=0, which leads also to ++ * an error and the IFD is not read in. */ + ss = TIFFSeekFile_M(tif, offsetBase[2] + cnt * 12 + 2, 0); + wt = (uint32_t)(offsetBase[1] + 8); ++ // wt = (uint32_t)(ss + 400); ++ if (TIFFIsByteSwapped(tif)) ++ TIFFSwabLong(&wt); + rr = TIFFWriteFile_M(tif, &wt, 4); + +-#ifdef WORDS_BIGENDIAN +- fprintf(stderr, "----- Expect error messages about 'Error fetching " +- "directory count.' -----\n"); +-#else + fprintf(stderr, "----- Expect error messages about 'Error fetching " + "directory link.' -----\n"); +-#endif +- /* TIFFNumberOfDirectories() returns now 4 */ ++ /* TIFFNumberOfDirectories() returns now 4, because for an IFD linked ++ * list dircount=0 is not treated as an error and there is an offset ++ * (=1) to a next IFD. Then, at the fifth IFD a link error occurs. */ + lastdir = TIFFNumberOfDirectories(tif); + TIFFSetDirectory(tif, 0); + CHECKCURDIRNUM_M(tif, 0, __LINE__); + +- /* For LE-machines the next TIFFSetDirectory(3) fails with error +- * messages: ++ /* TIFFSetDirectory(3) fails with error messages: + * test_current_dirnum_incrementing_wl.tif: Failed to allocate + * memory for to read TIFF directory (0 elements of 12 bytes each). + * TIFFReadDirectory: Failed to read directory at offset 178. +- * +- * For BE-machines, next TIFFSetDirectory(3) results in an error +- * but that TIFFSetDirectory(3) sets the IFD active. Warning messages: +- * TIFFReadDirectory: Warning, Unknown field with tag 1 (0x1) +- * encountered. +- * MissingRequired: TIFF directory is missing required +- * "ImageLength" field. ++ * The IFD 3 is not read in and curdir is set to 65535 (non-existing ++ * directory). + */ +-#ifdef WORDS_BIGENDIAN +- fprintf(stderr, +- "----- Expect error messages about ' Unknown field with tag 1 " +- "(0x1) encountered.' AND 'MissingRequired: TIFF directory is " +- "missing required ImageLength field.' -----\n"); +-#else + fprintf(stderr, + "----- Expect error messages about 'Failed to allocate " + "memory for to read TIFF directory.' AND 'Failed to read " + "directory ..' -----\n"); +-#endif + if (TIFFSetDirectory(tif, 3)) + { + fprintf(stderr, +@@ -2090,11 +2085,7 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + } + + /* Fails in 4.6.0 */ +-#ifdef WORDS_BIGENDIAN +- CHECKCURDIRNUM_M(tif, (tdir_t)(3), __LINE__); +-#else + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); +-#endif + } + + unlink(filename); +-- +GitLab + + +From b470af83d549e890e4ace55620405d06cff20ae5 Mon Sep 17 00:00:00 2001 +From: Su_Laus <[email protected]> +Date: Mon, 18 Nov 2024 19:52:26 +0100 +Subject: [PATCH 3/3] Add two missing TIFFClose() in order to avoid memory + leaks. Closes #656 + +--- a/test/test_directory.c ++++ b/test/test_directory.c +@@ -1365,6 +1365,7 @@ int test_rewrite_lastdir_offset(unsigned int openMode) + filename, N_DIRECTORIES, count); + goto failure; + } ++ /* hint: file was closed by count_directories() */ + unlink(filename); + return 0; + +@@ -1511,6 +1512,8 @@ int test_lastdir_offset(unsigned int openMode) + } + } + } ++ /* hint: files are always closed by count_directories() and ++ * get_dir_offsets() */ + unlink(filename_optimized); + unlink(filename_non_optimized); + return 0; +@@ -2088,6 +2091,7 @@ int test_current_dirnum_incrementing(int testcase, unsigned int openMode) + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); + } + ++ TIFFClose(tif); + unlink(filename); + return 0; + +@@ -2176,6 +2180,7 @@ int test_curdircount_setting(unsigned int openMode) + CHECKCURDIRNUM_M(tif, (tdir_t)(-1), __LINE__); + } + ++ TIFFClose(tif); + unlink(filename); + return 0; + +-- +GitLab diff --git a/media-libs/tiff/tiff-4.7.0-r1.ebuild b/media-libs/tiff/tiff-4.7.0-r1.ebuild index 594d624584af..f2dfdbb95f6b 100644 --- a/media-libs/tiff/tiff-4.7.0-r1.ebuild +++ b/media-libs/tiff/tiff-4.7.0-r1.ebuild @@ -50,7 +50,10 @@ MULTILIB_WRAPPED_HEADERS=( /usr/include/tiffconf.h ) -PATCHES=( "${FILESDIR}"/${P}-fix-test-race.patch ) # bug#943020 +PATCHES=( + "${FILESDIR}"/${P}-fix-test-race.patch # bug#943020 + "${FILESDIR}"/${P}-test-directory-big-endian.patch +) src_prepare() { default
