Changes in TIFF v4.7.1
======================

.. table:: References
    :widths: auto

    ======================  ==========================================
    Current Version         v4.7.1 (:tag:`v4.7.1`)
    Previous Version        :doc:`v4.7.0 <v4.7.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 :file:`ChangeLog` file
included in the release package and by the Git commit history.

Major changes
-------------

None

Software configuration changes
------------------------------

* Define HAVE_JPEGTURBO_DUAL_MODE_8_12 and LERC_STATIC in tif_config.h.
* CMake: define WORDS_BIGENDIAN via tif_config.h
* doc/CMakeLists.txt: remove useless cmake_minimum_required()
* CMake: fix build with LLVM/Clang 17 (fixes :issue:`651`)
* CMake: set CMP0074 new policy
* Set LINKER_LANGUAGE for C targets with C deps
* Export tiffxx cmake target (fixes :issue:`674`)
* autogen.sh: Enable verbose wget.
* configure.ac: Syntax updates for Autoconf 2.71
* autogen.sh: Re-implement based on autoreconf. Failure to update
  config.guess/config.sub does not return error (fixes :issue:`672`)
* CMake: fix CMake 4.0 warning when minimum required version is < 3.10.
* CMake: Add build option tiff-static (fixes :issue:`709`)

Library changes
---------------

New/improved functionalities:

* Add TIFFOpenOptionsSetWarnAboutUnknownTags() for explicit control about 
  emitting warnings for unknown tags. No longer emit warnings about unknown
  tags by default

* tif_predict.c: speed-up decompression in some cases.

API/ABI breaks:

* None

Bug fixes:

* tif_fax3: For fax group 3 data if no EOL is detected, reading is retried
  without synchronisation for EOLs. (fixes :issue:`54`)

* Updating TIFFMergeFieldInfo() with read_count=write_count=0 for FIELD_IGNORE.
  Updating TIFFMergeFieldInfo() with read_count=write_count=0 for FIELD_IGNORE.
  Improving handling when field_name = NULL.
  (fixes :issue:`532`)

* tiff.h: add COMPRESSION_JXL_DNG_1_7=52546 as used for JPEGXL compression in 
  the DNG 1.7 specification

* TIFFWriteDirectorySec: Increment string length for ASCII tags for codec tags
  defined with FIELD_xxx bits, as it is done for FIELD_CUSTOM tags.
  (fixes :issue:`648`)

* Do not error out on a tag whose tag count value is zero, just issue a warning.
  Fix parsing a private tag 0x80a6 (fixes :issue:`647`)

* TIFFDefaultTransferFunction(): give up beyond td_bitspersample = 24
  (Fixes https://github.com/OSGeo/gdal/issues/10875)

* tif_getimage.c: Remove unnecessary calls to TIFFRGBAImageOK()
  (fixes :issue:`175`)

* Fix writing a Predictor=3 file with non-native endianness

* _TIFFVSetField(): fix potential use of unallocated memory (out-of-bounds 
   read / nullptr dereference) in case of out-of-memory situation when dealing
   with custom tags (fixes :issue:`663`)

* tif_fax3.c: Error out for CCITT fax encoding if SamplesPerPixel is not equal
  1 and PlanarConfiguration = Contiguous (fixes :issue:`26`)

* tif_fax3.c: error out after a number of times end-of-line or unexpected bad
  code words have been reached. (fixes :issue:`670`)

* Fix memory leak in TIFFSetupStrips() (fixes :issue:`665`)

* tif_zip.c: Provide zlib allocation functions.
  Otherwise for zlib built with -DZ_SOLO inflating will fail.

* Fix memory leak in _TIFFSetDefaultCompressionState. (fixes :issue:`676`)

* tif_predict.c: Don’t overwrite input buffer of TIFFWriteScanline() if
  "prediction" is enabled. Use extra working buffer in PredictorEncodeRow().
  (fixes :issue:`5`)

* tif_getimage.c: update some integer overflow checks (fixes :issue:`79`)

* tif_getimage.c: Fix buffer underflow crash for less raster rows at
  TIFFReadRGBAImageOriented() (fixes :issue:`704`)

* TIFFReadRGBAImage(): several fixes to avoid buffer overflows.

* Correct passing arguments to TIFFCvtIEEEFloatToNative() and
  TIFFCvtIEEEDoubleToNative() if HAVE_IEEEFP is not defined. (fixes
  :issue:`699`)

* LZWDecode(): avoid nullptr dereference when trying to read again after EOI 
  marker has been found with remaining output bytes (fixes :issue:`698`)

* TIFFSetSubDirectory(): check _TIFFCheckDirNumberAndOffset() return.

* TIFFUnlinkDirectory() and TIFFWriteDirectorySec(): clear tif_rawcp when
  clearing tif_rawdata (fixes :issue:`711`)

* JPEGEncodeRaw(): error out if a previous scanline failed to be written, to
  avoid out-of-bounds access (fixes :issue:`714`)

* tif_jpeg: Fix bug in JPEGDecodeRaw() if JPEG_LIB_MK1_OR_12BIT is defined for
  8/12bit dual mode, introduced in libjpeg-turbo 2.2, which was actually
  released as 3.0. (fixes :issue:`717`)

* add assert for TIFFReadCustomDirectory infoarray check.

Other changes:

* tif_jpeg.c: use JPEG_MAX_DIMENSION constant instead of hard-coded 65535 value

* tif_lzw.c / tif_packbits.c: use NULL instead of 0.

* Take into account PACKBITS_READ_ONLY, LZW_READ_ONLY, and LERC_READ_ONLY
  macros to disable compiling write-support for those codecs.

* tif_lerc.c: add missing casts

* Merge several functions implemented twice in different modules.
  (see :issue:`154`)

* Remove get_field_type form TIFFField structure because it is not used 
  anymore and rename other parameter to set_get_field_type

* Silence some Coverity Scan warnigs and mark already dismissed ones.

* References to codec libraries updated and missing codec compile defines
  (tiffconf.h) added.

* Move mkg3states under libtiff/tools. (fixes :issue:`708`)

* tiff_itrunc(): don't use rand() to please Coverity Scan.

* tiffio.h: fix compilation with LOGLUV_PUBLIC=0

* LICENSE.md: Add BSD license for Lempel-Ziv & Welch compression (tif_lzw.c)
  (fixes :issue:`431`)

Documentation
-------------

* TIFFRGBAImage.rst note added for incorrect saving of images with TIFF
  orientation from 5 (LeftTop) to 8 (LeftBottom) in the raster.

* TIFFRGBAImage.rst note added about un-associated alpha handling
  (fixes :issue:`67`)

* Update "Defining New TIFF Tags" description. (fixes :issue:`642`)

* Fix return type of TIFFReadEncodedTile()

* Update the documentation to reflect deprecated typedefs.

* TIFFWriteDirectory.rst: Clarify TIFFSetWriteOffset() only sets offset for
  image data and not for IFD data.

* Update documentation on re-entrancy and thread safety.

* Remove dead links to no more existing Awaresystems web-site.

* Updating BigTIFF specification and some miscelaneous editions.

* Replace some last links and remove last todos.

* Added hints for correct allocation of TIFFYCbCrtoRGB structure and its
  associated buffers. (fixes :issue:`681`)

* Added chapter to "Using the TIFF Library" with links to handling multi-page
  TIFF and custom directories. (fixes :issue:`43`)

* update TIFFOpen.rst with the return values of mapproc and unmapproc.
  (fixes :issue:`12`)

Tools changes
-------------

New/improved functionality:

* tiffinfo: add a -W switch to warn about unknown tags.

* tiffdither: process all pages in input TIFF file.

Bug fixes:

* ppm2tiff: Fix bug in `pack_words` trailing bytes, where last two bytes of
  each line were written wrongly. (fixes :issue:`467`)

* fax2ps: fix regression of commit 28c38d648b64a66c3218778c4745225fe3e3a06d
  where TIFFTAG_FAXFILLFUNC is being used rather than an output buffer
  (fixes :issue:`649`)

* tiff2pdf: Check TIFFTAG_TILELENGTH and TIFFTAGTILEWIDTH (fixes :issue:`650`)

* tiff2pdf: check h_samp and v_samp for range 1 to 4 to avoid division by
  zero. (fixes :issue:`654`)

* tiff2pdf: avoid null pointer dereference. (fixes :issue:`741`)

* Improve non-secure integer overflow check (comparison of division result
  with multiplicant) at compiler optimisation in tiffcp, rgb2ycbcr and tiff2rgba. (fixes :issue:`546`)

* tiff2rgba: fix some "a partial expression can generate an overflow before it
  is assigned to a broader type" warnings. (fixes :issue:`682`)

* tiffdither/tiffmedian: Don't skip the first line of the input image. 
  (fixes :issue:`703`)

* tiffdither: avoid out-of-bounds read identified in :issue:`733`

* tiffmedian: error out if TIFFReadScanline() fails (fixes :issue:`707`)

* tiffmedian: close input file. (fixes :issue:`735`)

* thumbail: avoid potential out of bounds access (fixes :issue:`715`)

* tiffcrop: close open TIFF files and release allocated buffers before exiting
  in case of error to avoid memory leaks. (fixes :issue:`716`)

* tiffcrop: fix double-free and memory leak exposed by :issue:`721`

* tiffcrop: avoid buffer overflow. (fixes :issue:`740`)

* tiffcrop: avoid nullptr dereference. (fixes :issue:`734`)

* tiffdump: Fix coverity scan issue CID 1373365: Passing tainted expression
  \*datamem to PrintData, which uses it as a divisor or modulus.

* tiff2ps: check return of TIFFGetFiled() for TIFFTAG_STRIPBYTECOUNTS and
  TIFFTAG_TILEBYTECOUNTS to avoid NULL pointer dereference.
  (fixes :issue:`718`)

* tiffcmp: fix memory leak when second file cannot be opened.
  (fixes :issue:`718` and :issue:`729`)

* tiffcp: fix setting compression level for lossless codecs.
  (fixes :issue:`730`)

* raw2tiff: close input file before exit (fixes :issue:`742`)

Changes to contributed and unsupported tools
--------------------------------------------

* addtiffo: Fixing MSVC compiler warnings

* Improved oss-fuzz fuzzer tiff_read_rgba_fuzzer.cc.

* oss-fuzz: fix memory leak in fuzz target.
