
XZ Utils Release Notes
======================

5.6.1 (2024-03-09)

    * liblzma: Fixed two bugs relating to GNU indirect function (IFUNC)
      with GCC. The more serious bug caused a program linked with
      liblzma to crash on start up if the flag -fprofile-generate was
      used to build liblzma. The second bug caused liblzma to falsely
      report an invalid write to Valgrind when loading liblzma.

    * xz: Changed the messages for thread reduction due to memory
      constraints to only appear under the highest verbosity level.

    * Build:

        - Fixed a build issue when the header file <linux/landlock.h>
          was present on the system but the Landlock system calls were
          not defined in <sys/syscall.h>.

        - The CMake build now warns and disables NLS if both gettext
          tools and pre-created .gmo files are missing. Previously,
          this caused the CMake build to fail.

    * Minor improvements to man pages.

    * Minor improvements to tests.


5.6.0 (2024-02-24)

    This bumps the minor version of liblzma because new features were
    added. The API and ABI are still backward compatible with liblzma
    5.4.x and 5.2.x and 5.0.x.

    NOTE: As described in the NEWS for 5.5.2beta, the core components
    are now under the BSD Zero Clause License (0BSD).

    Since 5.5.2beta:

    * liblzma:

        - Disabled the branchless C variant in the LZMA decoder based
          on the benchmark results from the community.

        - Disabled x86-64 inline assembly on x32 to fix the build.

    * Sandboxing support in xz:

        - Landlock is now used even when xz needs to create files.
          In this case the sandbox has to be more permissive than
          when no files need to be created. A similar thing was
          already in use with pledge(2) since 5.3.4alpha.

        - Landlock and pledge(2) are now stricter when reading from
          more than one input file and only writing to standard output.

        - Added support for Landlock ABI version 4.

    * CMake:

        - Default to -O2 instead of -O3 with CMAKE_BUILD_TYPE=Release.
          -O3 is not useful for speed and makes the code larger.

        - Now builds lzmainfo and lzmadec.

        - xzdiff, xzgrep, xzless, xzmore, and their symlinks are now
          installed. The scripts are also tested during "make test".

        - Added translation support for xz, lzmainfo, and the
          man pages.

        - Applied the symbol versioning workaround for MicroBlaze that
          is used in the Autotools build.

        - The general XZ Utils and liblzma API documentation is now
          installed.

        - The CMake component names were changed a little and several
          were added. liblzma_Runtime and liblzma_Development are
          unchanged.

        - Minimum required CMake version is now 3.14. However,
          translation support is disabled with CMake versions
          older than 3.20.

        - The CMake-based build is now close to feature parity with the
          Autotools-based build. Most importantly a few tests aren't
          run yet. Testing the CMake-based build on different operating
          systems would be welcome now. See the comment at the top of
          CMakeLists.txt.

    * Fixed a bug in the Autotools feature test for ARM64 CRC32
      instruction support for old versions of Clang. This did not
      affect the CMake build.

    * Windows:

        - The build instructions in INSTALL and windows/INSTALL*.txt
          were revised completely.

        - windows/build-with-cmake.bat along with the instructions
          in windows/INSTALL-MinGW-w64_with_CMake.txt should make
          it very easy to build liblzma.dll and xz.exe on Windows
          using CMake and MinGW-w64 with either GCC or Clang/LLVM.

        - windows/build.bash was updated. It now works on MSYS2 and
          on GNU/Linux (cross-compiling) to create a .zip and .7z
          package for 32-bit and 64-bit x86 using GCC + MinGW-w64.

    * The TODO file is no longer installed as part of the
      documentation. The file is out of date and does not reflect
      the actual tasks that will be completed in the future.

    * Translations:

        - Translated lzmainfo man pages are now installed. These
          had been forgotten in earlier versions.

        - Updated Croatian, Esperanto, German, Hungarian, Korean,
          Polish, Romanian, Spanish, Swedish, Vietnamese, and Ukrainian
          translations.

        - Updated German, Korean, Romanian, and Ukrainian man page
          translations.

    * Added a few tests.

    Summary of new features added in the 5.5.x development releases:

    * liblzma:

        - LZMA decoder: Speed optimizations to the C code and
          added GCC & Clang compatible inline assembly for x86-64.

        - Added lzma_mt_block_size() to recommend a Block size for
          multithreaded encoding.

        - Added CLMUL-based CRC32 on x86-64 and E2K with runtime
          processor detection. Similar to CRC64, on 32-bit x86 it
          isn't available unless --disable-assembler is used.

        - Optimized the CRC32 calculation on ARM64 platforms using the
          CRC32 instructions. Runtime detection for the instruction is
          used on GNU/Linux, FreeBSD, Windows, and macOS. If the
          compiler flags indicate unconditional CRC32 instruction
          support (+crc) then the generic version is not built.

        - Added definitions of mask values like
          LZMA_INDEX_CHECK_MASK_CRC32 to <lzma/index.h>.

    * xz:

        - Multithreaded mode is now the default. This improves
          compression speed and creates .xz files that can be
          decompressed in multithreaded mode. The downsides are
          increased memory usage and slightly worse compression ratio.

        - Added a new command line option --filters to set the filter
          chain using the liblzma filter string syntax.

        - Added new command line options --filters1 ... --filters9 to
          set additional filter chains using the liblzma filter string
          syntax. The --block-list option now allows specifying filter
          chains that were set using these new options.

        - Ported the command line tools to Windows MSVC.
          Visual Studio 2015 or later is required.

    * Added lz4 support to xzdiff/xzcmp and xzgrep.


5.5.2beta (2024-02-14)

    * Licensing change: The core components are now under the
      BSD Zero Clause License (0BSD). In XZ Utils 5.4.6 and older
      and 5.5.1alpha these components are in the public domain and
      obviously remain so; the change affects the new releases only.

      0BSD is an extremely permissive license which doesn't require
      retaining or reproducing copyright or license notices when
      distributing the code, thus in practice there is extremely
      little difference to public domain.

    * liblzma

        - Significant speed optimizations to the LZMA decoder were
          made. There are now three variants that can be chosen at
          build time:

            * Basic C version: This is a few percent faster than
              5.4.x due to some new optimizations.

            * Branchless C: This is currently the default on platforms
              for which there is no assembly code. This should be a few
              percent faster than the basic C version.

            * x86-64 inline assembly. This works with GCC and Clang.

          The default choice can currently be overridden by setting
          LZMA_RANGE_DECODER_CONFIG in CPPFLAGS: 0 means the basic
          version and 3 means that branchless C version.

        - Optimized the CRC32 calculation on ARM64 platforms using the
          CRC32 instructions. The instructions are optional in ARMv8.0
          and are required in ARMv8.1 and later. Runtime detection for
          the instruction is used on GNU/Linux, FreeBSD, Windows, and
          macOS. If the compiler flags indicate unconditional CRC32
          instruction support (+crc) then the generic version is not
          built.

    * Added lz4 support to xzdiff/xzcmp and xzgrep.

    * Man pages of xzdiff/xzcmp, xzgrep, and xzmore were rewritten
      to simplify licensing of the man page translations.

    * Translations:

        - Updated Chinese (simplified), German, Korean, Polish,
          Romanian, Spanish, Swedish, and Ukrainian translations.

        - Updated German, Korean, Romanian, and Ukrainian man page
          translations.

    * Small improvements to the tests.

    * Added doc/examples/11_file_info.c. It was added to the Git
      repository in 2017 but forgotten to be added into distribution
      tarballs.

    * Removed doc/examples_old. These were from 2012.

    * Removed the macos/build.sh script. It had not been updated
      since 2013.


5.5.1alpha (2024-01-26)

    * Added a new filter for RISC-V binaries. The filter can be used
      for 32-bit and 64-bit binaries with either little or big
      endianness. In liblzma, the Filter ID is LZMA_FILTER_RISCV (0x0B)
      and the xz option is --riscv. liblzma filter string syntax
      recognizes this filter as "riscv".

    * liblzma:

        - Added lzma_mt_block_size() to recommend a Block size for
          multithreaded encoding

        - Added CLMUL-based CRC32 on x86-64 and E2K with runtime
          processor detection. Similar to CRC64, on 32-bit x86 it
          isn't available unless --disable-assembler is used.

        - Implemented GNU indirect function (IFUNC) as a runtime
          function dispatching method for CRC32 and CRC64 fast
          implementations on x86. Only GNU/Linux (glibc) and FreeBSD
          builds will use IFUNC, unless --enable-ifunc is specified to
          configure.

        - Added definitions of mask values like
          LZMA_INDEX_CHECK_MASK_CRC32 to <lzma/index.h>.

        - The XZ logo is now included in the Doxygen generated
          documentation. It is licensed under Creative Commons
          Attribution-ShareAlike 4.0.

    * xz:

        - Multithreaded mode is now the default. This improves
          compression speed and creates .xz files that can be
          decompressed multithreaded at the cost of increased memory
          usage and slightly worse compression ratio.

        - Added new command line option --filters to set the filter
          chain using liblzma filter string syntax.

        - Added new command line options --filters1 ... --filters9 to
          set additional filter chains using liblzma filter string
          syntax. The --block-list option now allows specifying filter
          chains that were set using these new options.

        - Added support for Linux Landlock as a sandboxing method.

        - xzdec now supports pledge(2), Capsicum, and Linux Landlock as
          sandboxing methods.

        - Progress indicator time stats remain accurate after pausing
          xz with SIGTSTP.

        - Ported xz and xzdec to Windows MSVC. Visual Studio 2015 or
          later is required.

    * CMake Build:

        - Supports pledge(2), Capsicum, and Linux Landlock sandboxing
          methods.

        - Replacement functions for getopt_long() are used on platforms
          that do not have it.

    * Enabled unaligned access by default on PowerPC64LE and on RISC-V
      targets that define __riscv_misaligned_fast.

    * Tests:

        - Added two new fuzz targets to OSS-Fuzz.

        - Implemented Continuous Integration (CI) testing using
          GitHub Actions.

    * Changed quoting style from `...' to '...' in all messages,
      scripts, and documentation.

    * Added basic Codespell support to help catch typo errors.


5.4.6 (2024-01-26)

    * Fixed a bug involving internal function pointers in liblzma not
      being initialized to NULL. The bug can only be triggered if
      lzma_filters_update() is called on a LZMA1 encoder, so it does
      not affect xz or any application known to us that uses liblzma.

    * xz:

        - Fixed a regression introduced in 5.4.2 that caused encoding
          in the raw format to unnecessarily fail if --suffix was not
          used. For instance, the following command no longer reports
          that --suffix must be used:

              echo foo | xz --format=raw --lzma2 | wc -c

        - Fixed an issue on MinGW-w64 builds that prevented reading
          from or writing to non-terminal character devices like NUL.

    * Added a new test.


5.4.5 (2023-11-31)

    * liblzma:

        - Use __attribute__((__no_sanitize_address__)) to avoid address
          sanitization with CRC64 CLMUL. It uses 16-byte-aligned reads
          which can extend past the bounds of the input buffer and
          inherently trigger address sanitization errors. This isn't
          a bug.

        - Fixed an assertion failure that could be triggered by a large
          unpadded_size argument. It was verified that there was no
          other bug than the assertion failure.

        - Fixed a bug that prevented building with Windows Vista
          threading when __attribute__((__constructor__)) is not
          supported.

    * xz now properly handles special files such as "con" or "nul" on
      Windows. Before this fix, the following wrote "foo" to the
      console and deleted the input file "con_xz":

          echo foo | xz > con_xz
          xz --suffix=_xz --decompress con_xz

    * Build systems:

        - Allow builds with Windows win95 threading and small mode when
          __attribute__((__constructor__)) is supported.

        - Added a new line to liblzma.pc for MSYS2 (Windows):

              Cflags.private: -DLZMA_API_STATIC

          When compiling code that will link against static liblzma,
          the LZMA_API_STATIC macro needs to be defined on Windows.

        - CMake specific changes:

            * Fixed a bug that allowed CLOCK_MONOTONIC to be used even
              if the check for it failed.

            * Fixed a bug where configuring CMake multiple times
              resulted in HAVE_CLOCK_GETTIME and HAVE_CLOCK_MONOTONIC
              not being set.

            * Fixed the build with MinGW-w64-based Clang/LLVM 17.
              llvm-windres now has more accurate GNU windres emulation
              so the GNU windres workaround from 5.4.1 is needed with
              llvm-windres version 17 too.

            * The import library on Windows is now properly named
              "liblzma.dll.a" instead of "libliblzma.dll.a"

            * Fixed a bug causing the Ninja Generator to fail on
              UNIX-like systems. This bug was introduced in 5.4.0.

            * Added a new option to disable CLMUL CRC64.

            * A module-definition (.def) file is now created when
              building liblzma.dll with MinGW-w64.

            * The pkg-config liblzma.pc file is now installed on all
              builds except when using MSVC on Windows.

            * Added large file support by default for platforms that
              need it to handle files larger than 2 GiB. This includes
              MinGW-w64, even 64-bit builds.

    * Small fixes and improvements to the tests.

    * Updated translations: Chinese (simplified) and Esperanto.


5.4.4 (2023-08-02)

    * liblzma and xzdec can now build against WASI SDK when threading
      support is disabled. xz and tests don't build yet.

    * CMake:

        - Fixed a bug preventing other projects from including liblzma
          multiple times using find_package().

        - Don't create broken symlinks in Cygwin and MSYS2 unless
          supported by the environment. This prevented building for the
          default MSYS2 environment. The problem was introduced in
          xz 5.4.0.

    * Documentation:

        - Small improvements to man pages.

        - Small improvements and typo fixes for liblzma API
          documentation.

    * Tests:

        - Added a new section to INSTALL to describe basic test usage
          and address recent questions about building the tests when
          cross compiling.

        - Small fixes and improvements to the tests.

    * Translations:

        - Fixed a mistake that caused one of the error messages to not
          be translated. This only affected versions 5.4.2 and 5.4.3.

        - Updated the Chinese (simplified), Croatian, Esperanto, German,
          Korean, Polish, Romanian, Spanish, Swedish, Ukrainian, and
          Vietnamese translations.

        - Updated the German, Korean, Romanian, and Ukrainian man page
          translations.


5.4.3 (2023-05-04)

    * All fixes from 5.2.12

    * Features in the CMake build can now be disabled as CMake cache
      variables, similar to the Autotools build.

    * Minor update to the Croatian translation.


5.4.2 (2023-03-18)

    * All fixes from 5.2.11 that were not included in 5.4.1.

    * If xz is built with support for the Capsicum sandbox but running
      in an environment that doesn't support Capsicum, xz now runs
      normally without sandboxing instead of exiting with an error.

    * liblzma:

        - Documentation was updated to improve the style, consistency,
          and completeness of the liblzma API headers.

        - The Doxygen-generated HTML documentation for the liblzma API
          header files is now included in the source release and is
          installed as part of "make install". All JavaScript is
          removed to simplify license compliance and to reduce the
          install size.

        - Fixed a minor bug in lzma_str_from_filters() that produced
          too many filters in the output string instead of reporting
          an error if the input array had more than four filters. This
          bug did not affect xz.

    * Build systems:

        - autogen.sh now invokes the doxygen tool via the new wrapper
          script doxygen/update-doxygen, unless the command line option
          --no-doxygen is used.

        - Added microlzma_encoder.c and microlzma_decoder.c to the
          VS project files for Windows and to the CMake build. These
          should have been included in 5.3.2alpha.

    * Tests:

        - Added a test to the CMake build that was forgotten in the
          previous release.

        - Added and refactored a few tests.

    * Translations:

        - Updated the Brazilian Portuguese translation.

        - Added Brazilian Portuguese man page translation.


5.4.1 (2023-01-11)

    * liblzma:

        - Fixed the return value of lzma_microlzma_encoder() if the
          LZMA options lc/lp/pb are invalid. Invalid lc/lp/pb options
          made the function return LZMA_STREAM_END without encoding
          anything instead of returning LZMA_OPTIONS_ERROR.

        - Windows / Visual Studio: Workaround a possible compiler bug
          when targeting 32-bit x86 and compiling the CLMUL version of
          the CRC64 code. The CLMUL code isn't enabled by the Windows
          project files but it is in the CMake-based builds.

    * Build systems:

        - Windows-specific CMake changes:

            * Don't try to enable CLMUL CRC64 code if _mm_set_epi64x()
              isn't available. This fixes CMake-based build with Visual
              Studio 2013.

            * Created a workaround for a build failure with windres
              from GNU binutils. It is used only when the C compiler
              is GCC (not Clang). The workaround is incompatible
              with llvm-windres, resulting in "XZx20Utils" instead
              of "XZ Utils" in the resource file, but without the
              workaround llvm-windres works correctly. See the
              comment in CMakeLists.txt for details.

            * Included the resource files in the xz and xzdec build
              rules. Building the command line tools is still
              experimental but possible with MinGW-w64.

        - Visual Studio: Added stream_decoder_mt.c to the project
          files. Now the threaded decompressor lzma_stream_decoder_mt()
          gets built. CMake-based build wasn't affected.

        - Updated windows/INSTALL-MSVC.txt to mention that CMake-based
          build is now the preferred method with Visual Studio. The
          project files will probably be removed after 5.4.x releases.

        - Changes to #defines in config.h:

            * HAVE_DECL_CLOCK_MONOTONIC was replaced by
              HAVE_CLOCK_MONOTONIC. The old macro was always defined
              in configure-generated config.h to either 0 or 1. The
              new macro is defined (to 1) only if the declaration of
              CLOCK_MONOTONIC is available. This matches the way most
              other config.h macros work and makes things simpler with
              other build systems.

            * HAVE_DECL_PROGRAM_INVOCATION_NAME was replaced by
              HAVE_PROGRAM_INVOCATION_NAME for the same reason.

    * Tests:

        - Fixed test script compatibility with ancient /bin/sh
          versions. Now the five test_compress_* tests should
          no longer fail on Solaris 10.

        - Added and refactored a few tests.

    * Translations:

        - Updated the Catalan and Esperanto translations.

        - Added Korean and Ukrainian man page translations.


5.4.0 (2022-12-13)

    This bumps the minor version of liblzma because new features were
    added. The API and ABI are still backward compatible with liblzma
    5.2.x and 5.0.x.

    Since 5.3.5beta:

    * All fixes from 5.2.10.

    * The ARM64 filter is now stable. The xz option is now --arm64.
      Decompression requires XZ Utils 5.4.0. In the future the ARM64
      filter will be supported by XZ for Java, XZ Embedded (including
      the version in Linux), LZMA SDK, and 7-Zip.

    * Translations:

        - Updated Catalan, Croatian, German, Romanian, and Turkish
          translations.

        - Updated German man page translations.

        - Added Romanian man page translations.

    Summary of new features added in the 5.3.x development releases:

    * liblzma:

        - Added threaded .xz decompressor lzma_stream_decoder_mt().
          It can use multiple threads with .xz files that have multiple
          Blocks with size information in Block Headers. The threaded
          encoder in xz has always created such files.

          Single-threaded encoder cannot store the size information in
          Block Headers even if one used LZMA_FULL_FLUSH to create
          multiple Blocks, so this threaded decoder cannot use multiple
          threads with such files.

          If there are multiple Streams (concatenated .xz files), one
          Stream will be decompressed completely before starting the
          next Stream.

        - A new decoder flag LZMA_FAIL_FAST was added. It makes the
          threaded decompressor report errors soon instead of first
          flushing all pending data before the error location.

        - New Filter IDs:
            * LZMA_FILTER_ARM64 is for ARM64 binaries.
            * LZMA_FILTER_LZMA1EXT is for raw LZMA1 streams that don't
              necessarily use the end marker.

        - Added lzma_str_to_filters(), lzma_str_from_filters(), and
          lzma_str_list_filters() to convert a preset or a filter chain
          string to a lzma_filter[] and vice versa. These should make
          it easier to write applications that allow users to specify
          custom compression options.

        - Added lzma_filters_free() which can be convenient for freeing
          the filter options in a filter chain (an array of lzma_filter
          structures).

        - lzma_file_info_decoder() to makes it a little easier to get
          the Index field from .xz files. This helps in getting the
          uncompressed file size but an easy-to-use random access
          API is still missing which has existed in XZ for Java for
          a long time.

        - Added lzma_microlzma_encoder() and lzma_microlzma_decoder().
          It is used by erofs-utils and may be used by others too.

          The MicroLZMA format is a raw LZMA stream (without end marker)
          whose first byte (always 0x00) has been replaced with
          bitwise-negation of the LZMA properties (lc/lp/pb). It was
          created for use in EROFS but may be used in other contexts
          as well where it is important to avoid wasting bytes for
          stream headers or footers. The format is also supported by
          XZ Embedded (the XZ Embedded version in Linux got MicroLZMA
          support in Linux 5.16).

          The MicroLZMA encoder API in liblzma can compress into a
          fixed-sized output buffer so that as much data is compressed
          as can be fit into the buffer while still creating a valid
          MicroLZMA stream. This is needed for EROFS.

        - Added lzma_lzip_decoder() to decompress the .lz (lzip) file
          format version 0 and the original unextended version 1 files.
          Also lzma_auto_decoder() supports .lz files.

        - lzma_filters_update() can now be used with the multi-threaded
          encoder (lzma_stream_encoder_mt()) to change the filter chain
          after LZMA_FULL_BARRIER or LZMA_FULL_FLUSH.

        - In lzma_options_lzma, allow nice_len = 2 and 3 with the match
          finders that require at least 3 or 4. Now it is internally
          rounded up if needed.

        - CLMUL-based CRC64 on x86-64 and E2K with runtime processor
          detection. On 32-bit x86 it currently isn't available unless
          --disable-assembler is used which can make the non-CLMUL
          CRC64 slower; this might be fixed in the future.

        - Building with --disable-threads --enable-small
          is now thread-safe if the compiler supports
          __attribute__((__constructor__)).

    * xz:

        - Using -T0 (--threads=0) will now use multi-threaded encoder
          even on a single-core system. This is to ensure that output
          from the same xz binary is identical on both single-core and
          multi-core systems.

        - --threads=+1 or -T+1 is now a way to put xz into
          multi-threaded mode while using only one worker thread.
          The + is ignored if the number is not 1.

        - A default soft memory usage limit is now used for compression
          when -T0 is used and no explicit limit has been specified.
          This soft limit is used to restrict the number of threads
          but if the limit is exceeded with even one thread then xz
          will continue with one thread using the multi-threaded
          encoder and this limit is ignored. If the number of threads
          is specified manually then no default limit will be used;
          this affects only -T0.

          This change helps on systems that have very many cores and
          using all of them for xz makes no sense. Previously xz -T0
          could run out of memory on such systems because it attempted
          to reserve memory for too many threads.

          This also helps with 32-bit builds which don't have a large
          amount of address space that would be required for many
          threads. The default soft limit for -T0 is at most 1400 MiB
          on all 32-bit platforms.

        - Previously a low value in --memlimit-compress wouldn't cause
          xz to switch from multi-threaded mode to single-threaded mode
          if the limit cannot otherwise be met; xz failed instead. Now
          xz can switch to single-threaded mode and then, if needed,
          scale down the LZMA2 dictionary size too just like it already
          did when it was started in single-threaded mode.

        - The option --no-adjust no longer prevents xz from scaling down
          the number of threads as that doesn't affect the compressed
          output (only performance). Now --no-adjust only prevents
          adjustments that affect compressed output, that is, with
          --no-adjust xz won't switch from multi-threaded mode to
          single-threaded mode and won't scale down the LZMA2
          dictionary size.

        - Added a new option --memlimit-mt-decompress=LIMIT. This is
          used to limit the number of decompressor threads (possibly
          falling back to single-threaded mode) but it will never make
          xz refuse to decompress a file. This has a system-specific
          default value because without any limit xz could end up
          allocating memory for the whole compressed input file, the
          whole uncompressed output file, multiple thread-specific
          decompressor instances and so on. Basically xz could
          attempt to use an insane amount of memory even with fairly
          common files. The system-specific default value is currently
          the same as the one used for compression with -T0.

          The new option works together with the existing option
          --memlimit-decompress=LIMIT. The old option sets a hard limit
          that must not be exceeded (xz will refuse to decompress)
          while the new option only restricts the number of threads.
          If the limit set with --memlimit-mt-decompress is greater
          than the limit set with --memlimit-compress, then the latter
          value is used also for --memlimit-mt-decompress.

        - Added new information to the output of xz --info-memory and
          new fields to the output of xz --robot --info-memory.

        - In --lzma2=nice=NUMBER allow 2 and 3 with all match finders
          now that liblzma handles it.

        - Don't mention endianness for ARM and ARM-Thumb filters in
          --long-help. The filters only work for little endian
          instruction encoding but modern ARM processors using
          big endian data access still use little endian
          instruction encoding. So the help text was misleading.
          In contrast, the PowerPC filter is only for big endian
          32/64-bit PowerPC code. Little endian PowerPC would need
          a separate filter.

        - Added decompression support for the .lz (lzip) file format
          version 0 and the original unextended version 1. It is
          autodetected by default. See also the option --format on
          the xz man page.

        - Sandboxing enabled by default:
            * Capsicum (FreeBSD)
            * pledge(2) (OpenBSD)

    * Scripts now support the .lz format using xz.

    * A few new tests were added.

    * The liblzma-specific tests are now supported in CMake-based
      builds too ("make test").


5.3.5beta (2022-12-01)

    * All fixes from 5.2.9.

    * liblzma:

        - Added new LZMA_FILTER_LZMA1EXT for raw encoder and decoder to
          handle raw LZMA1 streams that don't have end of payload marker
          (EOPM) alias end of stream (EOS) marker. It can be used in
          filter chains, for example, with the x86 BCJ filter.

        - Added lzma_str_to_filters(), lzma_str_from_filters(), and
          lzma_str_list_filters() to make it easier for applications
          to get custom compression options from a user and convert
          it to an array of lzma_filter structures.

        - Added lzma_filters_free().

        - lzma_filters_update() can now be used with the multi-threaded
          encoder (lzma_stream_encoder_mt()) to change the filter chain
          after LZMA_FULL_BARRIER or LZMA_FULL_FLUSH.

        - In lzma_options_lzma, allow nice_len = 2 and 3 with the match
          finders that require at least 3 or 4. Now it is internally
          rounded up if needed.

        - ARM64 filter was modified. It is still experimental.

        - Fixed LTO build with Clang if -fgnuc-version=10 or similar
          was used to make Clang look like GCC >= 10. Now it uses
          __has_attribute(__symver__) which should be reliable.

    * xz:

        - --threads=+1 or -T+1 is now a way to put xz into multi-threaded
          mode while using only one worker thread.

        - In --lzma2=nice=NUMBER allow 2 and 3 with all match finders
          now that liblzma handles it.

    * Updated translations: Chinese (simplified), Korean, and Turkish.


5.3.4alpha (2022-11-15)

    * All fixes from 5.2.7 and 5.2.8.

    * liblzma:

        - Minor improvements to the threaded decoder.

        - Added CRC64 implementation that uses SSSE3, SSE4.1, and CLMUL
          instructions on 32/64-bit x86 and E2K. On 32-bit x86 it's
          not enabled unless --disable-assembler is used but then
          the non-CLMUL code might be slower. Processor support is
          detected at runtime so this is built by default on x86-64
          and E2K. On these platforms, if compiler flags indicate
          unconditional CLMUL support (-msse4.1 -mpclmul) then the
          generic version is not built, making liblzma 8-9 KiB smaller
          compared to having both versions included.

          With extremely compressible files this can make decompression
          up to twice as fast but with typical files 5 % improvement
          is a more realistic expectation.

          The CLMUL version is slower than the generic version with
          tiny inputs (especially at 1-8 bytes per call, but up to
          16 bytes). In normal use in xz this doesn't matter at all.

        - Added an experimental ARM64 filter. This is *not* the final
          version! Files created with this experimental version won't
          be supported in the future versions! The filter design is
          a compromise where improving one use case makes some other
          cases worse.

        - Added decompression support for the .lz (lzip) file format
          version 0 and the original unextended version 1. See the
          API docs of lzma_lzip_decoder() for details. Also
          lzma_auto_decoder() supports .lz files.

        - Building with --disable-threads --enable-small
          is now thread-safe if the compiler supports
          __attribute__((__constructor__))

    * xz:

        - Added support for OpenBSD's pledge(2) as a sandboxing method.

        - Don't mention endianness for ARM and ARM-Thumb filters in
          --long-help. The filters only work for little endian
          instruction encoding but modern ARM processors using
          big endian data access still use little endian
          instruction encoding. So the help text was misleading.
          In contrast, the PowerPC filter is only for big endian
          32/64-bit PowerPC code. Little endian PowerPC would need
          a separate filter.

        - Added --experimental-arm64. This will be renamed once the
          filter is finished. Files created with this experimental
          filter will not be supported in the future!

        - Added new fields to the output of xz --robot --info-memory.

        - Added decompression support for the .lz (lzip) file format
          version 0 and the original unextended version 1. It is
          autodetected by default. See also the option --format on
          the xz man page.

    * Scripts now support the .lz format using xz.

    * Build systems:

        - New #defines in config.h: HAVE_ENCODER_ARM64,
          HAVE_DECODER_ARM64, HAVE_LZIP_DECODER, HAVE_CPUID_H,
          HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR, HAVE_USABLE_CLMUL

        - New configure options: --disable-clmul-crc,
          --disable-microlzma, --disable-lzip-decoder, and
          'pledge' is now an option in --enable-sandbox (but
          it's autodetected by default anyway).

        - INSTALL was updated to document the new configure options.

        - PACKAGERS now lists also --disable-microlzma and
          --disable-lzip-decoder as configure options that must
          not be used in builds for non-embedded use.

    * Tests:

        - Fix some of the tests so that they skip instead of fail if
          certain features have been disabled with configure options.
          It's still not perfect.

        - Other improvements to tests.

    * Updated translations: Croatian, Finnish, Hungarian, Polish,
      Romanian, Spanish, Swedish, and Ukrainian.


5.3.3alpha (2022-08-22)

    * All fixes from 5.2.6.

    * liblzma:

        - Fixed 32-bit build.

        - Added threaded .xz decompressor lzma_stream_decoder_mt().
          It can use multiple threads with .xz files that have multiple
          Blocks with size information in Block Headers. The threaded
          encoder in xz has always created such files.

          Single-threaded encoder cannot store the size information in
          Block Headers even if one used LZMA_FULL_FLUSH to create
          multiple Blocks, so this threaded decoder cannot use multiple
          threads with such files.

          If there are multiple Streams (concatenated .xz files), one
          Stream will be decompressed completely before starting the
          next Stream.

        - A new decoder flag LZMA_FAIL_FAST was added. It makes the
          threaded decompressor report errors soon instead of first
          flushing all pending data before the error location.

    * xz:

        - Using -T0 (--threads=0) will now use multi-threaded encoder
          even on a single-core system. This is to ensure that output
          from the same xz binary is identical on both single-core and
          multi-core systems.

        - A default soft memory usage limit is now used for compression
          when -T0 is used and no explicit limit has been specified.
          This soft limit is used to restrict the number of threads
          but if the limit is exceeded with even one thread then xz
          will continue with one thread using the multi-threaded
          encoder and this limit is ignored. If the number of threads
          is specified manually then no default limit will be used;
          this affects only -T0.

          This change helps on systems that have very many cores and
          using all of them for xz makes no sense. Previously xz -T0
          could run out of memory on such systems because it attempted
          to reserve memory for too many threads.

          This also helps with 32-bit builds which don't have a large
          amount of address space that would be required for many
          threads. The default limit is 1400 MiB on all 32-bit
          platforms with -T0.

          Now xz -T0 should just work. It might use too few threads
          in some cases but at least it shouldn't easily run out of
          memory. It's possible that this will be tweaked before 5.4.0.

        - Changes to --memlimit-compress and --no-adjust:

          In single-threaded mode, --memlimit-compress can make xz
          scale down the LZMA2 dictionary size to meet the memory usage
          limit. This obviously affects the compressed output. However,
          if xz was in threaded mode, --memlimit-compress could make xz
          reduce the number of threads but it wouldn't make xz switch
          from multi-threaded mode to single-threaded mode or scale
          down the LZMA2 dictionary size. This seemed illogical.

          Now --memlimit-compress can make xz switch to single-threaded
          mode if one thread in multi-threaded mode uses too much
          memory. If memory usage is still too high, then the LZMA2
          dictionary size can be scaled down too.

          The option --no-adjust was also changed so that it no longer
          prevents xz from scaling down the number of threads as that
          doesn't affect compressed output (only performance). After
          this commit --no-adjust only prevents adjustments that affect
          compressed output, that is, with --no-adjust xz won't switch
          from multithreaded mode to single-threaded mode and won't
          scale down the LZMA2 dictionary size.

        - Added a new option --memlimit-mt-decompress=LIMIT. This is
          used to limit the number of decompressor threads (possibly
          falling back to single-threaded mode) but it will never make
          xz refuse to decompress a file. This has a system-specific
          default value because without any limit xz could end up
          allocating memory for the whole compressed input file, the
          whole uncompressed output file, multiple thread-specific
          decompressor instances and so on. Basically xz could
          attempt to use an insane amount of memory even with fairly
          common files.

          The new option works together with the existing option
          --memlimit-decompress=LIMIT. The old option sets a hard limit
          that must not be exceeded (xz will refuse to decompress)
          while the new option only restricts the number of threads.
          If the limit set with --memlimit-mt-decompress is greater
          than the limit set with --memlimit-compress, then the latter
          value is used also for --memlimit-mt-decompress.

    * Tests:

        - Added a few more tests.

        - Added tests/code_coverage.sh to create a code coverage report
          of the tests.

    * Build systems:

        - Automake's parallel test harness is now used to make tests
          finish faster.

        - Added the CMake files to the distribution tarball. These were
          supposed to be in 5.2.5 already.

        - Added liblzma tests to the CMake build.

        - Windows: Fix building of liblzma.dll with the included
          Visual Studio project files.


5.3.2alpha (2021-10-28)

    This release was made on short notice so that recent erofs-utils can
    be built with LZMA support without needing a snapshot from xz.git.
    Thus many pending things were not included, not even updated
    translations (which would need to be updated for the new --list
    strings anyway).

    * All fixes from 5.2.5.

    * xz:

        - When copying metadata from the source file to the destination
          file, don't try to set the group (GID) if it is already set
          correctly. This avoids a failure on OpenBSD (and possibly on
          a few other OSes) where files may get created so that their
          group doesn't belong to the user, and fchown(2) can fail even
          if it needs to do nothing.

        - The --keep option now accepts symlinks, hardlinks, and
          setuid, setgid, and sticky files. Previously this required
          using --force.

        - Split the long strings used in --list and --info-memory modes
          to make them much easier for translators.

        - If built with sandbox support and enabling the sandbox fails,
          xz will now immediately exit with exit status of 1. Previously
          it would only display a warning if -vv was used.

        - Cap --memlimit-compress to 2000 MiB on MIPS32 because on
          MIPS32 userspace processes are limited to 2 GiB of address
          space.

    * liblzma:

        - Added lzma_microlzma_encoder() and lzma_microlzma_decoder().
          The API is in lzma/container.h.

          The MicroLZMA format is a raw LZMA stream (without end marker)
          whose first byte (always 0x00) has been replaced with
          bitwise-negation of the LZMA properties (lc/lp/pb). It was
          created for use in EROFS but may be used in other contexts
          as well where it is important to avoid wasting bytes for
          stream headers or footers. The format is also supported by
          XZ Embedded.

          The MicroLZMA encoder API in liblzma can compress into a
          fixed-sized output buffer so that as much data is compressed
          as can be fit into the buffer while still creating a valid
          MicroLZMA stream. This is needed for EROFS.

        - Added fuzzing support.

        - Support Intel Control-flow Enforcement Technology (CET) in
          32-bit x86 assembly files.

        - Visual Studio: Use non-standard _MSVC_LANG to detect C++
          standard version in the lzma.h API header. It's used to
          detect when "noexcept" can be used.

    * Scripts:

        - Fix exit status of xzdiff/xzcmp. Exit status could be 2 when
          the correct value is 1.

        - Fix exit status of xzgrep.

        - Detect corrupt .bz2 files in xzgrep.

        - Add zstd support to xzgrep and xzdiff/xzcmp.

        - Fix less(1) version detection in xzless. It failed if the
          version number from "less -V" contained a dot.

    * Fix typos and technical issues in man pages.

    * Build systems:

        - Windows: Fix building of resource files when config.h isn't
          used. CMake + Visual Studio can now build liblzma.dll.

        - Various fixes to the CMake support. It might still need a few
          more fixes even for liblzma-only builds.


5.3.1alpha (2018-04-29)

    * All fixes from 5.2.4.

    * Add lzma_file_info_decoder() into liblzma and use it in xz to
      implement the --list feature.

    * Capsicum sandbox support is enabled by default where available
      (FreeBSD >= 10).


5.2.12 (2023-05-04)

    * Fixed a build system bug that prevented building liblzma as a
      shared library when configured with --disable-threads. This bug
      affected releases 5.2.6 to 5.2.11 and 5.4.0 to 5.4.2.

    * Include <intrin.h> for Windows intrinsic functions where they are
      needed. This fixed a bug that prevented building liblzma using
      clang-cl on Windows.

    * Minor update to the Croatian translation. The small change
      applies to a string in both 5.2 and 5.4 branches.


5.2.11 (2023-03-18)

    * Removed all possible cases of null pointer + 0. It is undefined
      behavior in C99 and C17. This was detected by a sanitizer and had
      not caused any known issues.

    * Build systems:

        - Added a workaround for building with GCC on MicroBlaze Linux.
          GCC 12 on MicroBlaze doesn't support the __symver__ attribute
          even though __has_attribute(__symver__) returns true. The
          build is now done without the extra RHEL/CentOS 7 symbols
          that were added in XZ Utils 5.2.7. The workaround only
          applies to the Autotools build (not CMake).

        - CMake: Ensure that the C compiler language is set to C99 or
          a newer standard.

        - CMake changes from XZ Utils 5.4.1:

            * Added a workaround for a build failure with
              windres from GNU binutils.

            * Included the Windows resource files in the xz
              and xzdec build rules.


5.2.10 (2022-12-13)

    * xz: Don't modify argv[] when parsing the --memlimit* and
      --block-list command line options. This fixes confusing
      arguments in process listing (like "ps auxf").

    * GNU/Linux only: Use __has_attribute(__symver__) to detect if
      that attribute is supported. This fixes build on Mandriva where
      Clang is patched to define __GNUC__ to 11 by default (instead
      of 4 as used by Clang upstream).


5.2.9 (2022-11-30)

    * liblzma:

        - Fixed an infinite loop in LZMA encoder initialization
          if dict_size >= 2 GiB. (The encoder only supports up
          to 1536 MiB.)

        - Fixed two cases of invalid free() that can happen if
          a tiny allocation fails in encoder re-initialization
          or in lzma_filters_update(). These bugs had some
          similarities with the bug fixed in 5.2.7.

        - Fixed lzma_block_encoder() not allowing the use of
          LZMA_SYNC_FLUSH with lzma_code() even though it was
          documented to be supported. The sync-flush code in
          the Block encoder was already used internally via
          lzma_stream_encoder(), so this was just a missing flag
          in the lzma_block_encoder() API function.

        - GNU/Linux only: Don't put symbol versions into static
          liblzma as it breaks things in some cases (and even if
          it didn't break anything, symbol versions in static
          libraries are useless anyway). The downside of the fix
          is that if the configure options --with-pic or --without-pic
          are used then it's not possible to build both shared and
          static liblzma at the same time on GNU/Linux anymore;
          with those options --disable-static or --disable-shared
          must be used too.

    * New email address for bug reports is <xz@tukaani.org> which
      forwards messages to Lasse Collin and Jia Tan.


5.2.8 (2022-11-13)

    * xz:

        - If xz cannot remove an input file when it should, this
          is now treated as a warning (exit status 2) instead of
          an error (exit status 1). This matches GNU gzip and it
          is more logical as at that point the output file has
          already been successfully closed.

        - Fix handling of .xz files with an unsupported check type.
          Previously such printed a warning message but then xz
          behaved as if an error had occurred (didn't decompress,
          exit status 1). Now a warning is printed, decompression
          is done anyway, and exit status is 2. This used to work
          slightly before 5.0.0. In practice this bug matters only
          if xz has been built with some check types disabled. As
          instructed in PACKAGERS, such builds should be done in
          special situations only.

        - Fix "xz -dc --single-stream tests/files/good-0-empty.xz"
          which failed with "Internal error (bug)". That is,
          --single-stream was broken if the first .xz stream in
          the input file didn't contain any uncompressed data.

        - Fix displaying file sizes in the progress indicator when
          working in passthru mode and there are multiple input files.
          Just like "gzip -cdf", "xz -cdf" works like "cat" when the
          input file isn't a supported compressed file format. In
          this case the file size counters weren't reset between
          files so with multiple input files the progress indicator
          displayed an incorrect (too large) value.

    * liblzma:

        - API docs in lzma/container.h:
            * Update the list of decoder flags in the decoder
              function docs.
            * Explain LZMA_CONCATENATED behavior with .lzma files
              in lzma_auto_decoder() docs.

        - OpenBSD: Use HW_NCPUONLINE to detect the number of
          available hardware threads in lzma_physmem().

        - Fix use of wrong macro to detect x86 SSE2 support.
          __SSE2_MATH__ was used with GCC/Clang but the correct
          one is __SSE2__. The first one means that SSE2 is used
          for floating point math which is irrelevant here.
          The affected SSE2 code isn't used on x86-64 so this affects
          only 32-bit x86 builds that use -msse2 without -mfpmath=sse
          (there is no runtime detection for SSE2). It improves LZMA
          compression speed (not decompression).

        - Fix the build with Intel C compiler 2021 (ICC, not ICX)
          on Linux. It defines __GNUC__ to 10 but doesn't support
          the __symver__ attribute introduced in GCC 10.

    * Scripts: Ignore warnings from xz by using --quiet --no-warn.
      This is needed if the input .xz files use an unsupported
      check type.

    * Translations:

        - Updated Croatian and Turkish translations.

        - One new translations wasn't included because it needed
          technical fixes. It will be in upcoming 5.4.0. No new
          translations will be added to the 5.2.x branch anymore.

        - Renamed the French man page translation file from
          fr_FR.po to fr.po and thus also its install directory
          (like /usr/share/man/fr_FR -> .../fr).

        - Man page translations for upcoming 5.4.0 are now handled
          in the Translation Project.

    * Update doc/faq.txt a little so it's less out-of-date.


5.2.7 (2022-09-30)

    * liblzma:

        - Made lzma_filters_copy() to never modify the destination
          array if an error occurs. lzma_stream_encoder() and
          lzma_stream_encoder_mt() already assumed this. Before this
          change, if a tiny memory allocation in lzma_filters_copy()
          failed it would lead to a crash (invalid free() or invalid
          memory reads) in the cleanup paths of these two encoder
          initialization functions.

        - Added missing integer overflow check to lzma_index_append().
          This affects xz --list and other applications that decode
          the Index field from .xz files using lzma_index_decoder().
          Normal decompression of .xz files doesn't call this code
          and thus most applications using liblzma aren't affected
          by this bug.

        - Single-threaded .xz decoder (lzma_stream_decoder()): If
          lzma_code() returns LZMA_MEMLIMIT_ERROR it is now possible
          to use lzma_memlimit_set() to increase the limit and continue
          decoding. This was supposed to work from the beginning
          but there was a bug. With other decoders (.lzma or
          threaded .xz decoder) this already worked correctly.

        - Fixed accumulation of integrity check type statistics in
          lzma_index_cat(). This bug made lzma_index_checks() return
          only the type of the integrity check of the last Stream
          when multiple lzma_indexes were concatenated. Most
          applications don't use these APIs but in xz it made
          xz --list not list all check types from concatenated .xz
          files. In xz --list --verbose only the per-file "Check:"
          lines were affected and in xz --robot --list only the "file"
          line was affected.

        - Added ABI compatibility with executables that were linked
          against liblzma in RHEL/CentOS 7 or other liblzma builds
          that had copied the problematic patch from RHEL/CentOS 7
          (xz-5.2.2-compat-libs.patch). For the details, see the
          comment at the top of src/liblzma/validate_map.sh.

          WARNING: This uses __symver__ attribute with GCC >= 10.
          In other cases the traditional __asm__(".symver ...")
          is used. Using link-time optimization (LTO, -flto) with
          GCC versions older than 10 can silently result in
          broken liblzma.so.5 (incorrect symbol versions)! If you
          want to use -flto with GCC, you must use GCC >= 10.
          LTO with Clang seems to work even with the traditional
          __asm__(".symver ...") method.

    * xzgrep: Fixed compatibility with old shells that break if
      comments inside command substitutions have apostrophes (').
      This problem was introduced in 5.2.6.

    * Build systems:

        - New #define in config.h: HAVE_SYMBOL_VERSIONS_LINUX

        - Windows: Fixed liblzma.dll build with Visual Studio project
          files. It broke in 5.2.6 due to a change that was made to
          improve CMake support.

        - Windows: Building liblzma with UNICODE defined should now
          work.

        - CMake files are now actually included in the release tarball.
          They should have been in 5.2.5 already.

        - Minor CMake fixes and improvements.

    * Added a new translation: Turkish


5.2.6 (2022-08-12)

    * xz:

        - The --keep option now accepts symlinks, hardlinks, and
          setuid, setgid, and sticky files. Previously this required
          using --force.

        - When copying metadata from the source file to the destination
          file, don't try to set the group (GID) if it is already set
          correctly. This avoids a failure on OpenBSD (and possibly on
          a few other OSes) where files may get created so that their
          group doesn't belong to the user, and fchown(2) can fail even
          if it needs to do nothing.

        - Cap --memlimit-compress to 2000 MiB instead of 4020 MiB on
          MIPS32 because on MIPS32 userspace processes are limited
          to 2 GiB of address space.

    * liblzma:

        - Fixed a missing error-check in the threaded encoder. If a
          small memory allocation fails, a .xz file with an invalid
          Index field would be created. Decompressing such a file would
          produce the correct output but result in an error at the end.
          Thus this is a "mild" data corruption bug. Note that while
          a failed memory allocation can trigger the bug, it cannot
          cause invalid memory access.

        - The decoder for .lzma files now supports files that have
          uncompressed size stored in the header and still use the
          end of payload marker (end of stream marker) at the end
          of the LZMA stream. Such files are rare but, according to
          the documentation in LZMA SDK, they are valid.
          doc/lzma-file-format.txt was updated too.

        - Improved 32-bit x86 assembly files:
            * Support Intel Control-flow Enforcement Technology (CET)
            * Use non-executable stack on FreeBSD.

        - Visual Studio: Use non-standard _MSVC_LANG to detect C++
          standard version in the lzma.h API header. It's used to
          detect when "noexcept" can be used.

    * xzgrep:

        - Fixed arbitrary command injection via a malicious filename
          (CVE-2022-1271, ZDI-CAN-16587). A standalone patch for
          this was released to the public on 2022-04-07. A slight
          robustness improvement has been made since then and, if
          using GNU or *BSD grep, a new faster method is now used
          that doesn't use the old sed-based construct at all. This
          also fixes bad output with GNU grep >= 3.5 (2020-09-27)
          when xzgrepping binary files.

          This vulnerability was discovered by:
          cleemy desu wayo working with Trend Micro Zero Day Initiative

        - Fixed detection of corrupt .bz2 files.

        - Improved error handling to fix exit status in some situations
          and to fix handling of signals: in some situations a signal
          didn't make xzgrep exit when it clearly should have. It's
          possible that the signal handling still isn't quite perfect
          but hopefully it's good enough.

        - Documented exit statuses on the man page.

        - xzegrep and xzfgrep now use "grep -E" and "grep -F" instead
          of the deprecated egrep and fgrep commands.

        - Fixed parsing of the options -E, -F, -G, -P, and -X. The
          problem occurred when multiple options were specified in
          a single argument, for example,

              echo foo | xzgrep -Fe foo

          treated foo as a filename because -Fe wasn't correctly
          split into -F -e.

        - Added zstd support.

    * xzdiff/xzcmp:

        - Fixed wrong exit status. Exit status could be 2 when the
          correct value is 1.

        - Documented on the man page that exit status of 2 is used
          for decompression errors.

        - Added zstd support.

    * xzless:

        - Fix less(1) version detection. It failed if the version number
          from "less -V" contained a dot.

    * Translations:

        - Added new translations: Catalan, Croatian, Esperanto,
          Korean, Portuguese, Romanian, Serbian, Spanish, Swedish,
          and Ukrainian

        - Updated the Brazilian Portuguese translation.

        - Added French man page translation. This and the existing
          German translation aren't complete anymore because the
          English man pages got a few updates and the translators
          weren't reached so that they could update their work.

    * Build systems:

        - Windows: Fix building of resource files when config.h isn't
          used. CMake + Visual Studio can now build liblzma.dll.

        - Various fixes to the CMake support. Building static or shared
          liblzma should work fine in most cases. In contrast, building
          the command line tools with CMake is still clearly incomplete
          and experimental and should be used for testing only.


5.2.5 (2020-03-17)

    * liblzma:

        - Fixed several C99/C11 conformance bugs. Now the code is clean
          under gcc/clang -fsanitize=undefined. Some of these changes
          might have a negative effect on performance with old GCC
          versions or compilers other than GCC and Clang. The configure
          option --enable-unsafe-type-punning can be used to (mostly)
          restore the old behavior but it shouldn't normally be used.

        - Improved API documentation of lzma_properties_decode().

        - Added a very minor encoder speed optimization.

    * xz:

        - Fixed a crash in "xz -dcfv not_an_xz_file". All four options
          were required to trigger it. The crash occurred in the
          progress indicator code when xz was in passthru mode where
          xz works like "cat".

        - Fixed an integer overflow with 32-bit off_t. It could happen
          when decompressing a file that has a long run of zero bytes
          which xz would try to write as a sparse file. Since the build
          system enables large file support by default, off_t is
          normally 64-bit even on 32-bit systems.

        - Fixes for --flush-timeout:
            * Fix semi-busy-waiting.
            * Avoid unneeded flushes when no new input has arrived
              since the previous flush was completed.

        - Added a special case for 32-bit xz: If --memlimit-compress is
          used to specify a limit that exceeds 4020 MiB, the limit will
          be set to 4020 MiB. The values "0" and "max" aren't affected
          by this and neither is decompression. This hack can be
          helpful when a 32-bit xz has access to 4 GiB address space
          but the specified memlimit exceeds 4 GiB. This can happen
          e.g. with some scripts.

        - Capsicum sandbox is now enabled by default where available
          (FreeBSD >= 10). The sandbox debug messages (xz -vv) were
          removed since they seemed to be more annoying than useful.

        - DOS build now requires DJGPP 2.05 instead of 2.04beta.
          A workaround for a locale problem with DJGPP 2.05 was added.

    * xzgrep and other scripts:

        - Added a configure option --enable-path-for-scripts=PREFIX.
          It is disabled by default except on Solaris where the default
          is /usr/xpg4/bin. See INSTALL for details.

        - Added a workaround for a POSIX shell detection problem on
          Solaris.

    * Build systems:

        - Added preliminary build instructions for z/OS. See INSTALL
          section 1.2.9.

        - Experimental CMake support was added. It should work to build
          static liblzma on a few operating systems. It may or may not
          work to build shared liblzma. On some platforms it can build
          xz and xzdec too but those are only for testing. See the
          comment in the beginning of CMakeLists.txt for details.

        - Visual Studio project files were updated.
          WindowsTargetPlatformVersion was removed from VS2017 files
          and set to "10.0" in the added VS2019 files. In the future
          the VS project files will be removed when CMake support is
          good enough.

        - New #defines in config.h: HAVE___BUILTIN_ASSUME_ALIGNED,
          HAVE___BUILTIN_BSWAPXX, and TUKLIB_USE_UNSAFE_TYPE_PUNNING.

        - autogen.sh has a new optional dependency on po4a and a new
          option --no-po4a to skip that step. This matters only if one
          wants to remake the build files. po4a is used to update the
          translated man pages but as long as the man pages haven't
          been modified, there's nothing to update and one can use
          --no-po4a to avoid the dependency on po4a.

    * Translations:

        - XZ Utils translations are now handled by the Translation
          Project: https://translationproject.org/domain/xz.html

        - All man pages are now included in German too.

        - New xz translations: Brazilian Portuguese, Finnish,
          Hungarian, Chinese (simplified), Chinese (traditional),
          and Danish (partial translation)

        - Updated xz translations: French, German, Italian, and Polish

        - Unfortunately a few new xz translations weren't included due
          to technical problems like too long lines in --help output or
          misaligned column headings in tables. In the future, many of
          these strings will be split and e.g. the table column
          alignment will be handled in software. This should make the
          strings easier to translate.


5.2.4 (2018-04-29)

    * liblzma:

        - Allow 0 as memory usage limit instead of returning
          LZMA_PROG_ERROR. Now 0 is treated as if 1 byte was specified,
          which effectively is the same as 0.

        - Use "noexcept" keyword instead of "throw()" in the public
          headers when a C++11 (or newer standard) compiler is used.

        - Added a portability fix for recent Intel C Compilers.

        - Microsoft Visual Studio build files have been moved under
          windows/vs2013 and windows/vs2017.

    * xz:

        - Fix "xz --list --robot missing_or_bad_file.xz" which would
          try to print an uninitialized string and thus produce garbage
          output. Since the exit status is non-zero, most uses of such
          a command won't try to interpret the garbage output.

        - "xz --list foo.xz" could print "Internal error (bug)" in a
          corner case where a specific memory usage limit had been set.


5.2.3 (2016-12-30)

    * xz:

        - Always close a file before trying to delete it to avoid
          problems on some operating system and file system combinations.

        - Fixed copying of file timestamps on Windows.

        - Added experimental (disabled by default) sandbox support using
          Capsicum (FreeBSD >= 10). See --enable-sandbox in INSTALL.

    * C99/C11 conformance fixes to liblzma. The issues affected at least
      some builds using link-time optimizations.

    * Fixed bugs in the rarely-used function lzma_index_dup().

    * Use of external SHA-256 code is now disabled by default.
      It can still be enabled by passing --enable-external-sha256
      to configure. The reasons to disable it by default (see INSTALL
      for more details):

        - Some OS-specific SHA-256 implementations conflict with
          OpenSSL and cause problems in programs that link against both
          liblzma and libcrypto. At least FreeBSD 10 and MINIX 3.3.0
          are affected.

        - The internal SHA-256 is faster than the SHA-256 code in
          some operating systems.

    * Changed CPU core count detection to use sched_getaffinity() on
      GNU/Linux and GNU/kFreeBSD.

    * Fixes to the build-system and xz to make xz buildable even when
      encoders, decoders, or threading have been disabled from libilzma
      using configure options. These fixes added two new #defines to
      config.h: HAVE_ENCODERS and HAVE_DECODERS.


5.2.2 (2015-09-29)

    * Fixed bugs in QNX-specific code.

    * Omitted the use of pipe2() even if it is available to avoid
      portability issues with some old Linux and glibc combinations.

    * Updated German translation.

    * Added project files to build static and shared liblzma (not the
      whole XZ Utils) with Visual Studio 2013 update 2 or later.

    * Documented that threaded decompression hasn't been implemented
      yet. A 5.2.0 NEWS entry describing multi-threading support had
      incorrectly said "decompression" when it should have said
      "compression".


5.2.1 (2015-02-26)

    * Fixed a compression-ratio regression in fast mode of LZMA1 and
      LZMA2. The bug is present in 5.1.4beta and 5.2.0 releases.

    * Fixed a portability problem in xz that affected at least OpenBSD.

    * Fixed xzdiff to be compatible with FreeBSD's mktemp which differs
      from most other mktemp implementations.

    * Changed CPU core count detection to use cpuset_getaffinity() on
      FreeBSD.


5.2.0 (2014-12-21)

    Since 5.1.4beta:

    * All fixes from 5.0.8

    * liblzma: Fixed lzma_stream_encoder_mt_memusage() when a preset
      was used.

    * xzdiff: If mktemp isn't installed, mkdir will be used as
      a fallback to create a temporary directory. Installing mktemp
      is still recommended.

    * Updated French, German, Italian, Polish, and Vietnamese
      translations.

    Summary of fixes and new features added in the 5.1.x development
    releases:

    * liblzma:

        - Added support for multi-threaded compression. See the
          lzma_mt structure, lzma_stream_encoder_mt(), and
          lzma_stream_encoder_mt_memusage() in <lzma/container.h>,
          lzma_get_progress() in <lzma/base.h>, and lzma_cputhreads()
          in <lzma/hardware.h> for details.

        - Made the uses of lzma_allocator const correct.

        - Added lzma_block_uncomp_encode() to create uncompressed
          .xz Blocks using LZMA2 uncompressed chunks.

        - Added support for LZMA_IGNORE_CHECK.

        - A few speed optimizations were made.

        - Added support for symbol versioning. It is enabled by default
          on GNU/Linux, other GNU-based systems, and FreeBSD.

        - liblzma (not the whole XZ Utils) should now be buildable
          with MSVC 2013 update 2 or later using windows/config.h.

    * xz:

        - Fixed a race condition in the signal handling. It was
          possible that e.g. the first SIGINT didn't make xz exit
          if reading or writing blocked and one had bad luck. The fix
          is non-trivial, so as of writing it is unknown if it will be
          backported to the v5.0 branch.

        - Multi-threaded compression can be enabled with the
          --threads (-T) option.
          [Fixed: This originally said "decompression".]

        - New command line options in xz: --single-stream,
          --block-size=SIZE, --block-list=SIZES,
          --flush-timeout=TIMEOUT, and --ignore-check.

        - xz -lvv now shows the minimum xz version that is required to
          decompress the file. Currently it is 5.0.0 for all supported
          .xz files except files with empty LZMA2 streams require 5.0.2.

    * xzdiff and xzgrep now support .lzo files if lzop is installed.
      The .tzo suffix is also recognized as a shorthand for .tar.lzo.


5.1.4beta (2014-09-14)

    * All fixes from 5.0.6

    * liblzma: Fixed the use of presets in threaded encoder
      initialization.

    * xz --block-list and --block-size can now be used together
      in single-threaded mode. Previously the combination only
      worked in multi-threaded mode.

    * Added support for LZMA_IGNORE_CHECK to liblzma and made it
      available in xz as --ignore-check.

    * liblzma speed optimizations:

        - Initialization of a new LZMA1 or LZMA2 encoder has been
          optimized. (The speed of reinitializing an already-allocated
          encoder isn't affected.) This helps when compressing many
          small buffers with lzma_stream_buffer_encode() and other
          similar situations where an already-allocated encoder state
          isn't reused. This speed-up is visible in xz too if one
          compresses many small files one at a time instead running xz
          once and giving all files as command-line arguments.

        - Buffer comparisons are now much faster when unaligned access
          is allowed (configured with --enable-unaligned-access). This
          speeds up encoding significantly. There is arch-specific code
          for 32-bit and 64-bit x86 (32-bit needs SSE2 for the best
          results and there's no run-time CPU detection for now).
          For other archs there is only generic code which probably
          isn't as optimal as arch-specific solutions could be.

        - A few speed optimizations were made to the SHA-256 code.
          (Note that the builtin SHA-256 code isn't used on all
          operating systems.)

    * liblzma can now be built with MSVC 2013 update 2 or later
      using windows/config.h.

    * Vietnamese translation was added.


5.1.3alpha (2013-10-26)

    * All fixes from 5.0.5

    * liblzma:

        - Fixed a deadlock in the threaded encoder.

        - Made the uses of lzma_allocator const correct.

        - Added lzma_block_uncomp_encode() to create uncompressed
          .xz Blocks using LZMA2 uncompressed chunks.

        - Added support for native threads on Windows and the ability
          to detect the number of CPU cores.

    * xz:

        - Fixed a race condition in the signal handling. It was
          possible that e.g. the first SIGINT didn't make xz exit
          if reading or writing blocked and one had bad luck. The fix
          is non-trivial, so as of writing it is unknown if it will be
          backported to the v5.0 branch.

        - Made the progress indicator work correctly in threaded mode.

        - Threaded encoder now works together with --block-list=SIZES.

        - Added preliminary support for --flush-timeout=TIMEOUT.
          It can be useful for (somewhat) real-time streaming. For
          now the decompression side has to be done with something
          else than the xz tool due to how xz does buffering, but this
          should be fixed.


5.1.2alpha (2012-07-04)

    * All fixes from 5.0.3 and 5.0.4

    * liblzma:

        - Fixed a deadlock and an invalid free() in the threaded encoder.

        - Added support for symbol versioning. It is enabled by default
          on GNU/Linux, other GNU-based systems, and FreeBSD.

        - Use SHA-256 implementation from the operating system if one is
          available in libc, libmd, or libutil. liblzma won't use e.g.
          OpenSSL or libgcrypt to avoid introducing new dependencies.

        - Fixed liblzma.pc for static linking.

        - Fixed a few portability bugs.

    * xz --decompress --single-stream now fixes the input position after
      successful decompression. Now the following works:

          echo foo | xz > foo.xz
          echo bar | xz >> foo.xz
          ( xz -dc --single-stream ; xz -dc --single-stream ) < foo.xz

      Note that it doesn't work if the input is not seekable
      or if there is Stream Padding between the concatenated
      .xz Streams.

    * xz -lvv now shows the minimum xz version that is required to
      decompress the file. Currently it is 5.0.0 for all supported .xz
      files except files with empty LZMA2 streams require 5.0.2.

    * Added an *incomplete* implementation of --block-list=SIZES to xz.
      It only works correctly in single-threaded mode and when
      --block-size isn't used at the same time. --block-list allows
      specifying the sizes of Blocks which can be useful e.g. when
      creating files for random-access reading.


5.1.1alpha (2011-04-12)

    * All fixes from 5.0.2

    * liblzma fixes that will also be included in 5.0.3:

        - A memory leak was fixed.

        - lzma_stream_buffer_encode() no longer creates an empty .xz
          Block if encoding an empty buffer. Such an empty Block with
          LZMA2 data would trigger a bug in 5.0.1 and older (see the
          first bullet point in 5.0.2 notes). When releasing 5.0.2,
          I thought that no encoder creates this kind of files but
          I was wrong.

        - Validate function arguments better in a few functions. Most
          importantly, specifying an unsupported integrity check to
          lzma_stream_buffer_encode() no longer creates a corrupt .xz
          file. Probably no application tries to do that, so this
          shouldn't be a big problem in practice.

        - Document that lzma_block_buffer_encode(),
          lzma_easy_buffer_encode(), lzma_stream_encoder(), and
          lzma_stream_buffer_encode() may return LZMA_UNSUPPORTED_CHECK.

        - The return values of the _memusage() functions are now
          documented better.

    * Support for multithreaded compression was added using the simplest
      method, which splits the input data into blocks and compresses
      them independently. Other methods will be added in the future.
      The current method has room for improvement, e.g. it is possible
      to reduce the memory usage.

    * Added the options --single-stream and --block-size=SIZE to xz.

    * xzdiff and xzgrep now support .lzo files if lzop is installed.
      The .tzo suffix is also recognized as a shorthand for .tar.lzo.

    * Support for short 8.3 filenames under DOS was added to xz. It is
      experimental and may change before it gets into a stable release.


5.0.8 (2014-12-21)

    * Fixed an old bug in xzgrep that affected OpenBSD and probably
      a few other operating systems too.

    * Updated French and German translations.

    * Added support for detecting the amount of RAM on AmigaOS/AROS.

    * Minor build system updates.


5.0.7 (2014-09-20)

    * Fix regressions introduced in 5.0.6:

        - Fix building with non-GNU make.

        - Fix invalid Libs.private value in liblzma.pc which broke
          static linking against liblzma if the linker flags were
          taken from pkg-config.


5.0.6 (2014-09-14)

    * xzgrep now exits with status 0 if at least one file matched.

    * A few minor portability and build system fixes


5.0.5 (2013-06-30)

    * lzmadec and liblzma's lzma_alone_decoder(): Support decompressing
      .lzma files that have less common settings in the headers
      (dictionary size other than 2^n or 2^n + 2^(n-1), or uncompressed
      size greater than 256 GiB). The limitations existed to avoid false
      positives when detecting .lzma files. The lc + lp <= 4 limitation
      still remains since liblzma's LZMA decoder has that limitation.

      NOTE: xz's .lzma support or liblzma's lzma_auto_decoder() are NOT
      affected by this change. They still consider uncommon .lzma headers
      as not being in the .lzma format. Changing this would give way too
      many false positives.

    * xz:

        - Interaction of preset and custom filter chain options was
          made less illogical. This affects only certain less typical
          uses cases so few people are expected to notice this change.

          Now when a custom filter chain option (e.g. --lzma2) is
          specified, all preset options (-0 ... -9, -e) earlier are on
          the command line are completely forgotten. Similarly, when
          a preset option is specified, all custom filter chain options
          earlier on the command line are completely forgotten.

          Example 1: "xz -9 --lzma2=preset=5 -e" is equivalent to "xz -e"
          which is equivalent to "xz -6e". Earlier -e didn't put xz back
          into preset mode and thus the example command was equivalent
          to "xz --lzma2=preset=5".

          Example 2: "xz -9e --lzma2=preset=5 -7" is equivalent to
          "xz -7". Earlier a custom filter chain option didn't make
          xz forget the -e option so the example was equivalent to
          "xz -7e".

        - Fixes and improvements to error handling.

        - Various fixes to the man page.

    * xzless: Fixed to work with "less" versions 448 and later.

    * xzgrep: Made -h an alias for --no-filename.

    * Include the previously missing debug/translation.bash which can
      be useful for translators.

    * Include a build script for Mac OS X. This has been in the Git
      repository since 2010 but due to a mistake in Makefile.am the
      script hasn't been included in a release tarball before.


5.0.4 (2012-06-22)

    * liblzma:

        - Fix lzma_index_init(). It could crash if memory allocation
          failed.

        - Fix the possibility of an incorrect LZMA_BUF_ERROR when a BCJ
          filter is used and the application only provides exactly as
          much output space as is the uncompressed size of the file.

        - Fix a bug in doc/examples_old/xz_pipe_decompress.c. It didn't
          check if the last call to lzma_code() really returned
          LZMA_STREAM_END, which made the program think that truncated
          files are valid.

        - New example programs in doc/examples (old programs are now in
          doc/examples_old). These have more comments and more detailed
          error handling.

    * Fix "xz -lvv foo.xz". It could crash on some corrupted files.

    * Fix output of "xz --robot -lv" and "xz --robot -lvv" which
      incorrectly printed the filename also in the "foo (x/x)" format.

    * Fix exit status of "xzdiff foo.xz bar.xz".

    * Fix exit status of "xzgrep foo binary_file".

    * Fix portability to EBCDIC systems.

    * Fix a configure issue on AIX with the XL C compiler. See INSTALL
      for details.

    * Update French, German, Italian, and Polish translations.


5.0.3 (2011-05-21)

    * liblzma fixes:

        - A memory leak was fixed.

        - lzma_stream_buffer_encode() no longer creates an empty .xz
          Block if encoding an empty buffer. Such an empty Block with
          LZMA2 data would trigger a bug in 5.0.1 and older (see the
          first bullet point in 5.0.2 notes). When releasing 5.0.2,
          I thought that no encoder creates this kind of files but
          I was wrong.

        - Validate function arguments better in a few functions. Most
          importantly, specifying an unsupported integrity check to
          lzma_stream_buffer_encode() no longer creates a corrupt .xz
          file. Probably no application tries to do that, so this
          shouldn't be a big problem in practice.

        - Document that lzma_block_buffer_encode(),
          lzma_easy_buffer_encode(), lzma_stream_encoder(), and
          lzma_stream_buffer_encode() may return LZMA_UNSUPPORTED_CHECK.

        - The return values of the _memusage() functions are now
          documented better.

    * Fix command name detection in xzgrep. xzegrep and xzfgrep now
      correctly use egrep and fgrep instead of grep.

    * French translation was added.


5.0.2 (2011-04-01)

    * LZMA2 decompressor now correctly accepts LZMA2 streams with no
      uncompressed data. Previously it considered them corrupt. The
      bug can affect applications that use raw LZMA2 streams. It is
      very unlikely to affect .xz files because no compressor creates
      .xz files with empty LZMA2 streams. (Empty .xz files are a
      different thing than empty LZMA2 streams.)

    * "xz --suffix=.foo filename.foo" now refuses to compress the
      file due to it already having the suffix .foo. It was already
      documented on the man page, but the code lacked the test.

    * "xzgrep -l foo bar.xz" works now.

    * Polish translation was added.


5.0.1 (2011-01-29)

    * xz --force now (de)compresses files that have setuid, setgid,
      or sticky bit set and files that have multiple hard links.
      The man page had it documented this way already, but the code
      had a bug.

    * gzip and bzip2 support in xzdiff was fixed.

    * Portability fixes

    * Minor fix to Czech translation


5.0.0 (2010-10-23)

    Only the most important changes compared to 4.999.9beta are listed
    here. One change is especially important:

      * The memory usage limit is now disabled by default. Some scripts
        written before this change may have used --memory=max on xz command
        line or in XZ_OPT. THESE USES OF --memory=max SHOULD BE REMOVED
        NOW, because they interfere with user's ability to set the memory
        usage limit himself. If user-specified limit causes problems to
        your script, blame the user.

    Other significant changes:

      * Added support for XZ_DEFAULTS environment variable. This variable
        allows users to set default options for xz, e.g. default memory
        usage limit or default compression level. Scripts that use xz
        must never set or unset XZ_DEFAULTS. Scripts should use XZ_OPT
        instead if they need a way to pass options to xz via an
        environment variable.

      * The compression settings associated with the preset levels
        -0 ... -9 have been changed. --extreme was changed a little too.
        It is now less likely to make compression worse, but with some
        files the new --extreme may compress slightly worse than the old
        --extreme.

      * If a preset level (-0 ... -9) is specified after a custom filter
        chain options have been used (e.g. --lzma2), the custom filter
        chain will be forgotten. Earlier the preset options were
        completely ignored after custom filter chain options had been
        seen.

      * xz will create sparse files when decompressing if the uncompressed
        data contains long sequences of binary zeros. This is done even
        when writing to standard output that is connected to a regular
        file and certain additional conditions are met to make it safe.

      * Support for "xz --list" was added. Combine with --verbose or
        --verbose --verbose (-vv) for detailed output.

      * I had hoped that liblzma API would have been stable after
        4.999.9beta, but there have been a couple of changes in the
        advanced features, which don't affect most applications:

          - Index handling code was revised. If you were using the old
            API, you will get a compiler error (so it's easy to notice).

          - A subtle but important change was made to the Block handling
            API. lzma_block.version has to be initialized even for
            lzma_block_header_decode(). Code that doesn't do it will work
            for now, but might break in the future, which makes this API
            change easy to miss.

      * The major soname has been bumped to 5.0.0. liblzma API and ABI
        are now stable, so the need to recompile programs linking against
        liblzma shouldn't arise soon.

