# Changes in TIFF v4.7.0

References
Current Version | v4.7.0 (tag v4.7.0)
Previous Version | v4.6.0
Primary Download Site | https://download.osgeo.org/libtiff/
Home HTTP Site #1 | http://www.simplesystems.org/libtiff/
Home HTTP Site #2 | https://libtiff.gitlab.io/libtiff/

This document provides a summary of significant changes made to the software between the previous and current versions (see above). A fully-detailed change summary is provided by the `ChangeLog` file included in the release package and by the Git commit history.

## Major changes

This version restores in the default build the availability of the tools that had been dropped in v4.6.0 (cf RFC 2: Restoring Needed LibTIFF Tools)

## Software configuration changes

- autoconf build: configure.ac: avoid -Werror passed to CFLAGS to interfere with feature detection

- autoconf build: fix error when running make clean (fixes issue #630)

- autoconf build: back off the minimum required automake version to 1.11

- autoconf.ac: fix detection of windows.h for mingw (fixes issue #605)

- libtiff-4.pc: Fix Requires.private missing Lerc. It provides a .pc file starting from version 4 (in autoconf builds, we assume that liblerc is at least version 4)

- CMake: Fix TIFF_INCLUDE_DIRS

- CMake: MinGW compilers don't need a .def file for shared library

- CMake: move libdeflate and Lerc to Requires.private

- CMake: enable resource compilation on all Windows.

## Library changes

New/improved functionalities:

- Add `TIFFOpenOptionsSetMaxCumulatedMemAlloc()`. This function complements `TIFFOpenOptionsSetMaxSingleMemAlloc()` to define the maximum cumulated memory allocations in byte, for a given TIFF handle, that libtiff internal memory allocation functions are allowed.

API/ABI breaks:

- None

Bug fixes:

- TIFFWriteDirectory(): Avoid overwriting following data if an IFD is enlarged.

- TIFFXYZToRGB: avoid integer overflow (fixes issue #644)

- uv_decode() and uv_encode(): avoid potential out-of-bounds array index (fixes issue #645)

- Fix cases where tif_curdir is set incorrectly. Fix cases where the current directory number (tif_curdir) is set inconsistently or incorrectly, depending on the previous history.

- TIFFRead[Scanline/EncodedStrip/EncodeTile]: 0-initialize output buffer if setupdecode fails ; most codecs: zero-initialize (not-yet-written parts of) output buffer if failure (fixes issue #375)

- OJPEG: reset subsampling_convert_state=0 in OJPEGPreDecode (fixes issue #183)

- ThunderRLE: fix failure when decoding last run. Bug seen with GhostPDL

- LERC codec: deal with issues with multi-band PlanarConfig=Contig and NaN values

- tif_fax3.c: error out after a number of times end-of-file has been reached (fixes issue #583)

- LZW: avoid warning about misaligned address with UBSAN (fixes issue #616)

- TIFFReadRGBAStrip/TIFFReadRGBATile: add more validation of col/row (fixes issue #622, CVE-2023-52356)

- tif_dirread.c: only issue TIFFGetFileSize() for large enough RAM requests

- Avoid FPEs (division by zero) in tif_getimage.c.

- Avoiding FPE (division by zero) for TIFFhowmany_32() and TIFFhowmany_64() macros by checking for denominator not zero before macros are executed. (fixes issue #628)

- Add non-zero check before division in TIFFComputeStrip()

- Fix wrong return of TIFFIsBigTIFF() in case byte-swapping is active

- Setting the TIFFFieldInfo field set_field_type should consider field_writecount not field_readcount

- Avoid memory leaks when using TIFFCreateDirectory() by releasing the allocated memory in the tif-structure.

- For non-terminated ASCII arrays, the buffer is first enlarged before a NULL is set at the end to avoid deleting the last character. (fixes issue #579)

- Check return value of _TIFFCreateAnonField(). (fixes issue #624, CVE-2024-7006)

- Prevent some out-of-memory attacks (https://gitlab.com/libtiff/libtiff/-/issues/614#note_1602683857)

- Ensure absolute seeking is forced independent of TIFFReadDirectory success. (fixes issue #618)

- tif_dirinfo.c: re-enable TIFFTAG_EP_CFAREPEATPATTERNDIM and TIFFTAG_EP_CFAPATTERN tags (fixes issue #608)

Other changes:

- Fix warnings with GCC 14

- tif_dir.c: Log source file, line number, and input tif for directory count error (fixes issue #627)

- Last usage of get_field_type of TIFFField structure at TIFFWriteDirectorySec() changed to using set_field_type.

- tif_jpeg.c/tif_ojpeg.c: remove likely ifdef tricks related to old compilers or unusual setups

- Remove _TIFFUInt64ToFloat() and _TIFFUInt64ToDouble()

- Remove support for _MSC_VER < 1500.

- Use #ifdef _WIN32 to test for Windows, and tiffio.h: remove definition of __WIN32__

## Documentation

- Amend manpages for changes in current directory index behaviour

- Note on using TIFFFlush() before TIFFClose() to check that the data has been successfully written to the file. (fixes issue #506)

- Update TIFF documentation about TIFFOpenOptions.rst and TIFFOpenOptionsSetMaxSingleMemAlloc() usage and some other small fixes (relates to CVE-2024-7006)

## Tools changes

Re-added tools:

> - fax2ps

> - fax2tiff

> - pal2rgb

> - ppm2tiff

> - raw2tiff

> - rgb2ycbcr

> - thumbnail

> - tiff2bw

> - tiff2rgba

> - tiffcmp

> - tiffcrop

> - tiffdither

> - tiffgt

> - tiffmedian

> - tiff2ps

> - tiff2pdf

New/improved functionality:

- tiff2rgba: Add background gradient option for alpha compositing

- tiffcp: -i flag restored

Bug fixes:

- tiffcrop: address Coverity scan issues 1605444, 1605445, and 16054

- tiffcrop: Apply "Fix heap-buffer-overflow in function extractImageSection"

- tiffcrop: fix buffer overflows, use after free (fixes issue #542, issue #550, issue #552)

- tiff2pdf: address Coverity scan issues

- tiff2pdf: fix inconsistent PLANARCONFIG value for the input and output TIFF

- tiff2pdf: fix issue with JPEG restart-interval marker when converting from JPEG-compressed files (fixes issue #539)

- tiff2pdf: red and blue were being swapped for RGBA decoding (fixes issue #253)

- tiff2pdf: fixes issue #596

- thumbnail: address Coverity scan issues

- tiffcp: Add check for limitMalloc return to fix Coverity 1603334

- tiffcp: preserve TIFFTAG_REFERENCEBLACKWHITE when doing YCbCr JPEG -> YCbCr JPEG

- tiffcp: replace PHOTOMETRIC_YCBCR with PHOTOMETRIC_RGB when outputing to compression != JPEG (refs issue #571)

- tiffcp: do not copy tags YCBCRCOEFFICIENTS, YCBCRSUBSAMPLING, YCBCRPOSITIONING, REFERENCEBLACKWHITE. Only set YCBCRSUBSAMPLING when generating YCbCr JPEG

- tiffcp: Check also codec of input image, not only from output image (fixes issue #606)

- Add some basic sanity checks for tiffcp and tiffcrop RGB->YCbCr JPEG conversions.

- fax2ps and fax2tiff: memory leak fixes (fixes issue #476)

- tiffmedian: memory leak fixes (fixes issue #599)

- fax2tiff: fix EOFB interpretation (fixes issue #191)

- fax2tiff: fix issue with unreasonable width input (fixes issue #249)

- tiffcp and tiffcrop: fixes issue #228

- tiff2rgba: fixes issue #469

- tiffdither: fixes issue #473

- tiffdump: fix wrong printf formatter in error message (Coverity 1472932)

- tiffset: avoid false positive Coverity Scan warning on 64-bit builds (Coverity 1518997)

- tifcp/tiffset: use correct format specifiers

## Changes to contributed and unsupported tools

- contrib/addtiffo: validate return of TIFFWriteEncodedXXXX() calls (Coverity 1024680)