[med-svn] [Git][med-team/libdeflate][upstream] New upstream version 1.8

Andreas Tille (@tille) gitlab at salsa.debian.org
Sun Oct 10 09:24:32 BST 2021



Andreas Tille pushed to branch upstream at Debian Med / libdeflate


Commits:
04e29cc8 by Andreas Tille at 2021-10-09T08:26:42+02:00
New upstream version 1.8
- - - - -


27 changed files:

- + .github/workflows/ci.yml
- − .travis.yml
- − NEWS
- + NEWS.md
- README.md
- common/compiler_gcc.h
- lib/arm/adler32_impl.h
- lib/arm/crc32_impl.h
- lib/arm/matchfinder_impl.h
- lib/bt_matchfinder.h
- lib/cpu_features_common.h
- lib/hc_matchfinder.h
- lib/utils.c
- lib/x86/adler32_impl.h
- lib/x86/crc32_impl.h
- lib/x86/crc32_pclmul_template.h
- lib/x86/decompress_impl.h
- lib/x86/matchfinder_impl.h
- libdeflate.h
- programs/benchmark.c
- programs/gzip.c
- programs/prog_util.c
- programs/prog_util.h
- scripts/android_tests.sh
- scripts/gzip_tests.sh
- scripts/make-windows-releases.sh
- scripts/run_tests.sh


Changes:

=====================================
.github/workflows/ci.yml
=====================================
@@ -0,0 +1,123 @@
+name: CI
+on: [pull_request]
+env:
+  CFLAGS: -Werror
+
+jobs:
+  x86_64-build-and-test:
+    name: Build and test (x86_64, ${{ matrix.os }}, ${{ matrix.compiler }})
+    strategy:
+      matrix:
+        os: [ubuntu-20.04, ubuntu-18.04, ubuntu-16.04]
+        compiler: [gcc, clang]
+        exclude:
+          # clang 3.8.0-2ubuntu4 crashes with:
+          # "fatal error: error in backend: Cannot select: 0x21025a0: v64i8 = X86ISD::VBROADCAST 0x2101fb0"
+          - os: ubuntu-16.04
+            compiler: clang
+    runs-on: ${{ matrix.os }}
+    env:
+      CC: ${{ matrix.compiler }}
+    steps:
+    - uses: actions/checkout at v2
+    - name: Install dependencies
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y clang llvm libz-dev valgrind
+    - run: scripts/run_tests.sh
+
+  other-arch-build-and-test:
+    name: Build and test (${{ matrix.arch }}, Debian Buster, ${{ matrix.compiler }})
+    strategy:
+      matrix:
+        arch: [armv6, armv7, aarch64, s390x, ppc64le]
+        compiler: [gcc, clang]
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout at v2
+      - uses: uraimo/run-on-arch-action at v2.0.5
+        with:
+          arch: ${{ matrix.arch }}
+          distro: buster
+          githubToken: ${{ github.token }}
+          install: |
+            apt-get update
+            apt-get install -y build-essential clang llvm libz-dev valgrind
+          run: |
+            # Valgrind and ASAN crash on at least s390x, ppc64le, and aarch64
+            # here.  (It's probably something related to the QEMU user-mode
+            # emulation that run-on-arch-action uses.)
+            export SKIP_VALGRIND=1
+            export SKIP_ASAN=1
+
+            case ${{ matrix.arch }} in
+            s390x)
+              # On s390x, in freestanding builds the shared library links to an
+              # external symbol __clzdi2, even when -static-libgcc is used.
+              export SKIP_FREESTANDING=1
+              ;;
+            aarch64)
+              # "ldd: exited with unknown exit code (139)"
+              if [ ${{ matrix.compiler }} = clang ]; then
+                export SKIP_SHARED_LIB=1
+              fi
+              ;;
+            esac
+
+            export CC=${{ matrix.compiler }}
+            scripts/run_tests.sh
+
+  macos-build-and-test:
+    name: Build and test (macOS)
+    runs-on: macos-latest
+    steps:
+    - uses: actions/checkout at v2
+    - run: make all check
+
+  windows-build-and-test:
+    name: Build and test (Windows)
+    runs-on: windows-latest
+    steps:
+    - uses: actions/checkout at v2
+    - shell: bash
+      run: |
+        PATH="C:\\msys64\\mingw64\\bin:C:\\msys64\\usr\\bin:$PATH" \
+          make CC=gcc all check
+
+  run-clang-static-analyzer:
+    name: Run clang static analyzer
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout at v2
+    - name: Install dependencies
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y clang-tools
+    - name: Run clang static analyzer
+      run: make scan-build
+
+  run-shellcheck:
+    name: Run shellcheck
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout at v2
+    - name: Install dependencies
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y shellcheck
+    - name: Run shellcheck
+      run: make shellcheck
+
+  cross-compile-for-windows:
+    name: Cross compile for Windows
+    runs-on: ubuntu-latest
+    steps:
+    - uses: actions/checkout at v2
+    - name: Install dependencies
+      run: |
+        sudo apt-get update
+        sudo apt-get install -y gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 libz-mingw-w64-dev
+    - name: 32-bit build
+      run: make CC=i686-w64-mingw32-gcc all test_programs
+    - name: 64-bit build
+      run: make CC=x86_64-w64-mingw32-gcc all test_programs


=====================================
.travis.yml deleted
=====================================
@@ -1,113 +0,0 @@
-language: c
-os: linux
-dist: focal
-compiler:
-  - gcc
-  - clang
-env:
-  global:
-    - CFLAGS=-Werror
-arch:
-  - amd64
-  - arm64
-  - ppc64le
-  - s390x
-before_install: sudo apt-get install -y libz-dev valgrind
-script: scripts/run_tests.sh
-
-# Additional jobs not generated by the above build matrix:
-jobs:
-  include:
-    # Jobs to test older Ubuntu distros.  Ideally these would be generated by
-    # the build matrix, but Travis CI doesn't support expanding by 'dist'...
-
-    - dist: precise
-      compiler: gcc
-      arch: amd64
-
-    - dist: precise
-      compiler: clang
-      arch: amd64
-
-    - dist: xenial
-      compiler: gcc
-      arch: amd64
-
-    - dist: xenial
-      compiler: clang
-      arch: amd64
-
-    - dist: xenial
-      compiler: gcc
-      arch: arm64
-      # Ignore incorrect -Wstrict-aliasing warning in adler32_neon_chunk(),
-      # not seen with any other compiler versions.
-      env: CFLAGS="-Wno-strict-aliasing -Werror"
-
-    - dist: xenial
-      compiler: clang
-      arch: arm64
-      # ASAN fails with internal error
-      env: DISABLE_ASAN=1
-
-    - dist: xenial
-      compiler: gcc
-      arch: ppc64le
-      # ASAN fails with internal error
-      env: DISABLE_ASAN=1
-
-    - dist: xenial
-      compiler: clang
-      arch: ppc64le
-      # ASAN fails with internal error
-      env: DISABLE_ASAN=1
-
-    - dist: xenial
-      compiler: gcc
-      arch: s390x
-
-    - dist: xenial
-      compiler: clang
-      arch: s390x
-
-    # Other Linux jobs
-
-    - name: clang static analyzer
-      before_install: sudo apt-get install -y clang
-      script: make scan-build
-
-    - name: shellcheck
-      before_install: sudo apt-get install -y shellcheck
-      script: make shellcheck
-
-    - name: Cross compile for Windows
-      before_install:
-        - sudo apt-get install -y gcc-mingw-w64-x86-64 libz-mingw-w64-dev
-      script:
-        - make CC=i686-w64-mingw32-gcc all test_programs
-        - make CC=x86_64-w64-mingw32-gcc all test_programs
-
-    # Non-Linux jobs
-
-    - name: macOS, xcode11
-      os: osx
-      osx_image: xcode11
-      before_install:
-      script: make all check
-
-    - name: macOS, xcode9.4
-      os: osx
-      osx_image: xcode9.4
-      before_install:
-      script: make all check
-
-    - name: macOS, xcode7.3
-      os: osx
-      osx_image: xcode7.3
-      before_install:
-      script: make all check
-
-    - name: Windows, MinGW
-      os: windows
-      before_install:
-      script: mingw32-make all check


=====================================
NEWS deleted
=====================================
@@ -1,200 +0,0 @@
-Version 1.7:
-	Added support for compression level 0, "no compression".
-
-	Added an ARM CRC32 instruction accelerated implementation of CRC32.
-
-	Added support for linking the programs to the shared library version of
-	libdeflate rather than to the static library version.
-
-	Made the compression level affect the minimum input size at which
-	compression is attempted.
-
-	Fixed undefined behavior in x86 Adler32 implementation.
-	(No miscompilations were observed in practice.)
-
-	Fixed undefined behavior in x86 CPU feature code.
-	(No miscompilations were observed in practice.)
-
-	Fixed installing shared lib symlink on macOS.
-
-	Documented third-party bindings.
-
-	Made a lot of improvements to the testing scripts and the CI
-	configuration file.
-
-	Lots of other small improvements and cleanups.
-
-Version 1.6:
-	Prevented gcc 10 from miscompiling libdeflate (workaround for
-	https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94994).
-
-	Removed workaround for gcc 5 and earlier producing slow code on
-	ARM32.  If this affects you, please upgrade your compiler.
-
-	New API function: libdeflate_zlib_decompress_ex().  It provides
-	the actual size of the stream that was decompressed, like the
-	gzip and DEFLATE equivalents.
-
-	libdeflate_zlib_decompress() now accepts trailing bytes after
-	the end of the stream, like the gzip and DEFLATE equivalents.
-
-	Added support for custom memory allocators.
-	(New API function: libdeflate_set_memory_allocator())
-
-	Added support for building the library in freestanding mode.
-
-	Building libdeflate no longer requires CPPFLAGS=-Icommon.
-
-Version 1.5:
-	Fixed up stdcall support on 32-bit Windows: the functions are
-	now exported using both suffixed and non-suffixed names, and
-	fixed libdeflate.h to be MSVC-compatible again.
-
-Version 1.4:
-	The 32-bit Windows build of libdeflate now uses the "stdcall"
-	calling convention instead of "cdecl".  If you're calling
-	libdeflate.dll directly from C or C++, you'll need to recompile
-	your code.  If you're calling it from another language, or
-	calling it indirectly using LoadLibrary(), you'll need to update
-	your code to use the stdcall calling convention.
-
-	The Makefile now supports building libdeflate as a shared
-	library (.dylib) on macOS.
-
-	Fixed a bug where support for certain optimizations and optional
-	features (file access hints and more precise timestamps) was
-	incorrectly omitted when libdeflate was compiled with -Werror.
-
-	Added 'make check' target to the Makefile.
-
-	Added CI configuration files.
-
-Version 1.3:
-	`make install` now supports customizing the directories into
-	which binaries, headers, and libraries are installed.
-
-	`make install` now installs into /usr/local by default.
-	To change it, use e.g. `make install PREFIX=/usr`.
-
-	`make install` now works on more platforms.
-
-	The Makefile now supports overriding the optimization flags.
-
-	The compression functions now correctly handle an output data
-	buffer >= 4 GiB in size, and `gzip` and `gunzip` now correctly
-	handle multi-gigabyte files (if enough memory is available).
-
-Version 1.2:
-	Slight improvements to decompression speed.
-
-	Added an AVX-512BW implementation of Adler-32.
-
-	The Makefile now supports a user-specified installation PREFIX.
-
-	Fixed build error with some Visual Studio versions.
-
-Version 1.1:
-	Fixed crash in CRC-32 code when the prebuilt libdeflate for
-	32-bit Windows was called by a program built with Visual Studio.
-
-	Improved the worst-case decompression speed of malicious data.
-
-	Fixed build error when compiling for an ARM processor without
-	hardware floating point support.
-
-	Improved performance on the PowerPC64 architecture.
-
-	Added soname to libdeflate.so, to make packaging easier.
-
-	Added 'make install' target to the Makefile.
-
-	The Makefile now supports user-specified CPPFLAGS.
-
-	The Windows binary releases now include the import library for
-	libdeflate.dll.  libdeflate.lib is now the import library, and
-	libdeflatestatic.lib is the static library.
-
-Version 1.0:
-	Added support for multi-member gzip files.
-
-	Moved architecture-specific code into subdirectories.  If you
-	aren't using the provided Makefile to build libdeflate, you now
-	need to compile lib/*.c and lib/*/*.c instead of just lib/*.c.
-
-	Added an ARM PMULL implementation of CRC-32, which speeds up
-	gzip compression and decompression on 32-bit and 64-bit ARM
-	processors that have the Cryptography Extensions.
-
-	Improved detection of CPU features, resulting in accelerated
-	functions being used in more cases.  This includes:
-
-	   - Detect CPU features on 32-bit x86, not just 64-bit as was
-	     done previously.
-
-	   - Detect CPU features on ARM, both 32 and 64-bit.
-	     (Limited to Linux only currently.)
-
-Version 0.8:
-	Build fixes for certain platforms and compilers.
-
-	libdeflate now produces the same output on all CPU architectures.
-
-	Improved documentation for building libdeflate on Windows.
-
-Version 0.7:
-	Fixed a very rare bug that caused data to be compressed incorrectly.
-	The bug affected compression levels 7 and below since libdeflate v0.2.
-	Although there have been no user reports of the bug, and I believe it
-	would have been highly unlikely to encounter on realistic data, it could
-	occur on data specially crafted to reproduce it.
-
-	Fixed a compilation error when building with clang 3.7.
-
-Version 0.6:
-	Various improvements to the gzip program's behavior.
-
-	Faster CRC-32 on AVX-capable processors.
-
-	Other minor changes.
-
-Version 0.5:
-	The CRC-32 checksum algorithm has been optimized with carryless
-	multiplication instructions for x86_64 (PCLMUL).  This speeds up gzip
-	compression and decompression.
-
-	Build fixes for certain platforms and compilers.
-
-	Added more test programs and scripts.
-
-	libdeflate is now entirely MIT-licensed.
-
-Version 0.4:
-	The Adler-32 checksum algorithm has been optimized with vector
-	instructions for x86_64 (SSE2 and AVX2) and ARM (NEON).  This speeds up
-	zlib compression and decompression.
-
-	To avoid naming collisions, functions and definitions in libdeflate's
-	API have been renamed to be prefixed with "libdeflate_" or
-	"LIBDEFLATE_".  Programs using the old API will need to be updated.
-
-	Various bug fixes and other improvements.
-
-Version 0.3:
-	Some bug fixes and other minor changes.
-
-Version 0.2:
-	Implemented a new block splitting algorithm which typically improves the
-	compression ratio slightly at all compression levels.
-
-	The compressor now outputs each block using the cheapest type (dynamic
-	Huffman, static Huffman, or uncompressed).
-
-	The gzip program has received an overhaul and now behaves more like the
-	standard version.
-
-	Build system updates, including: some build options were changed and
-	some build options were removed, and the default 'make' target now
-	includes the gzip program as well as the library.
-
-Version 0.1:
-	Initial official release.


=====================================
NEWS.md
=====================================
@@ -0,0 +1,230 @@
+# libdeflate release notes
+
+## Version 1.8
+
+* Added `-t` (test) option to `libdeflate-gunzip`.
+
+* Unaligned access optimizations are now enabled on WebAssembly builds.
+
+* Fixed a build error when building with the Intel C Compiler (ICC).
+
+* Fixed a build error when building with uClibc.
+
+* libdeflate's CI system has switched from Travis CI to GitHub Actions.
+
+* Made some improvements to test scripts.
+
+## Version 1.7
+
+* Added support for compression level 0, "no compression".
+
+* Added an ARM CRC32 instruction accelerated implementation of CRC32.
+
+* Added support for linking the programs to the shared library version of
+  libdeflate rather than to the static library version.
+
+* Made the compression level affect the minimum input size at which compression
+  is attempted.
+
+* Fixed undefined behavior in x86 Adler32 implementation.  (No miscompilations
+  were observed in practice.)
+
+* Fixed undefined behavior in x86 CPU feature code.  (No miscompilations were
+  observed in practice.)
+
+* Fixed installing shared lib symlink on macOS.
+
+* Documented third-party bindings.
+
+* Made a lot of improvements to the testing scripts and the CI configuration
+  file.
+
+* Lots of other small improvements and cleanups.
+
+## Version 1.6
+
+* Prevented gcc 10 from miscompiling libdeflate (workaround for
+  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94994).
+
+* Removed workaround for gcc 5 and earlier producing slow code on ARM32.  If
+  this affects you, please upgrade your compiler.
+
+* New API function: `libdeflate_zlib_decompress_ex()`.  It provides the actual
+  size of the stream that was decompressed, like the gzip and DEFLATE
+  equivalents.
+
+* `libdeflate_zlib_decompress()` now accepts trailing bytes after the end of the
+  stream, like the gzip and DEFLATE equivalents.
+
+* Added support for custom memory allocators.  (New API function:
+  `libdeflate_set_memory_allocator()`)
+
+* Added support for building the library in freestanding mode.
+
+* Building libdeflate no longer requires `CPPFLAGS=-Icommon`.
+
+## Version 1.5
+
+* Fixed up stdcall support on 32-bit Windows: the functions are now exported
+  using both suffixed and non-suffixed names, and fixed `libdeflate.h` to be
+  MSVC-compatible again.
+
+## Version 1.4
+
+* The 32-bit Windows build of libdeflate now uses the "stdcall" calling
+  convention instead of "cdecl".  If you're calling `libdeflate.dll` directly
+  from C or C++, you'll need to recompile your code.  If you're calling it from
+  another language, or calling it indirectly using `LoadLibrary()`, you'll need
+  to update your code to use the stdcall calling convention.
+
+* The Makefile now supports building libdeflate as a shared
+  library (`.dylib`) on macOS.
+
+* Fixed a bug where support for certain optimizations and optional features
+  (file access hints and more precise timestamps) was incorrectly omitted when
+  libdeflate was compiled with `-Werror`.
+
+* Added `make check` target to the Makefile.
+
+* Added CI configuration files.
+
+## Version 1.3
+
+* `make install` now supports customizing the directories into which binaries,
+  headers, and libraries are installed.
+
+* `make install` now installs into `/usr/local` by default.  To change it, use
+  e.g. `make install PREFIX=/usr`.
+
+* `make install` now works on more platforms.
+
+* The Makefile now supports overriding the optimization flags.
+
+* The compression functions now correctly handle an output data buffer >= 4 GiB
+  in size, and `gzip` and `gunzip` now correctly handle multi-gigabyte files (if
+  enough memory is available).
+
+## Version 1.2
+
+* Slight improvements to decompression speed.
+
+* Added an AVX-512BW implementation of Adler-32.
+
+* The Makefile now supports a user-specified installation `PREFIX`.
+
+* Fixed build error with some Visual Studio versions.
+
+## Version 1.1
+
+* Fixed crash in CRC-32 code when the prebuilt libdeflate for 32-bit Windows was
+  called by a program built with Visual Studio.
+
+* Improved the worst-case decompression speed of malicious data.
+
+* Fixed build error when compiling for an ARM processor without hardware
+  floating point support.
+
+* Improved performance on the PowerPC64 architecture.
+
+* Added soname to `libdeflate.so`, to make packaging easier.
+
+* Added `make install` target to the Makefile.
+
+* The Makefile now supports user-specified `CPPFLAGS`.
+
+* The Windows binary releases now include the import library for
+  `libdeflate.dll`.  `libdeflate.lib` is now the import library, and
+  `libdeflatestatic.lib` is the static library.
+
+## Version 1.0
+
+* Added support for multi-member gzip files.
+
+* Moved architecture-specific code into subdirectories.  If you aren't using the
+  provided Makefile to build libdeflate, you now need to compile `lib/*.c` and
+  `lib/*/*.c` instead of just `lib/*.c`.
+
+* Added an ARM PMULL implementation of CRC-32, which speeds up gzip compression
+  and decompression on 32-bit and 64-bit ARM processors that have the
+  Cryptography Extensions.
+
+* Improved detection of CPU features, resulting in accelerated functions being
+  used in more cases.  This includes:
+
+  * Detect CPU features on 32-bit x86, not just 64-bit as was done previously.
+
+  * Detect CPU features on ARM, both 32 and 64-bit.  (Limited to Linux only
+    currently.)
+
+## Version 0.8
+
+* Build fixes for certain platforms and compilers.
+
+* libdeflate now produces the same output on all CPU architectures.
+
+* Improved documentation for building libdeflate on Windows.
+
+## Version 0.7
+
+* Fixed a very rare bug that caused data to be compressed incorrectly.  The bug
+  affected compression levels 7 and below since libdeflate v0.2.  Although there
+  have been no user reports of the bug, and I believe it would have been highly
+  unlikely to encounter on realistic data, it could occur on data specially
+  crafted to reproduce it.
+
+* Fixed a compilation error when building with clang 3.7.
+
+## Version 0.6
+
+* Various improvements to the gzip program's behavior.
+
+* Faster CRC-32 on AVX-capable processors.
+
+* Other minor changes.
+
+## Version 0.5
+
+* The CRC-32 checksum algorithm has been optimized with carryless multiplication
+  instructions for `x86_64` (PCLMUL).  This speeds up gzip compression and
+  decompression.
+
+* Build fixes for certain platforms and compilers.
+
+* Added more test programs and scripts.
+
+* libdeflate is now entirely MIT-licensed.
+
+## Version 0.4
+
+* The Adler-32 checksum algorithm has been optimized with vector instructions
+  for `x86_64` (SSE2 and AVX2) and ARM (NEON).  This speeds up zlib compression
+  and decompression.
+
+* To avoid naming collisions, functions and definitions in libdeflate's API have
+  been renamed to be prefixed with `libdeflate_` or `LIBDEFLATE_`.  Programs
+  using the old API will need to be updated.
+
+* Various bug fixes and other improvements.
+
+## Version 0.3
+
+* Some bug fixes and other minor changes.
+
+## Version 0.2
+
+* Implemented a new block splitting algorithm which typically improves the
+  compression ratio slightly at all compression levels.
+
+* The compressor now outputs each block using the cheapest type (dynamic
+  Huffman, static Huffman, or uncompressed).
+
+* The gzip program has received an overhaul and now behaves more like the
+  standard version.
+
+* Build system updates, including: some build options were changed and some
+  build options were removed, and the default 'make' target now includes the
+  gzip program as well as the library.
+
+## Version 0.1
+
+* Initial official release.


=====================================
README.md
=====================================
@@ -1,5 +1,3 @@
-[![Build Status](https://travis-ci.org/ebiggers/libdeflate.svg?branch=master)](https://travis-ci.org/ebiggers/libdeflate)
-
 # Overview
 
 libdeflate is a library for fast, whole-buffer DEFLATE-based compression and
@@ -24,6 +22,8 @@ use this library are also provided:
   yet support very large files
 * benchmark, a program for benchmarking in-memory compression and decompression
 
+For the release notes, see the [NEWS file](NEWS.md).
+
 ## Table of Contents
 
 - [Building](#building)
@@ -194,6 +194,7 @@ The libdeflate project itself only provides a C library.  If you need to use
 libdeflate from a programming language other than C or C++, consider using the
 following bindings:
 
+* C#: [LibDeflate.NET](https://github.com/jzebedee/LibDeflate.NET)
 * Go: [go-libdeflate](https://github.com/4kills/go-libdeflate)
 * Java: [libdeflate-java](https://github.com/astei/libdeflate-java)
 * Julia: [LibDeflate.jl](https://github.com/jakobnissen/LibDeflate.jl)


=====================================
common/compiler_gcc.h
=====================================
@@ -147,7 +147,8 @@
  * needed.
  */
 #if (GCC_PREREQ(4, 0) && !GCC_PREREQ(5, 1)) || \
-    (defined(__clang__) && !CLANG_PREREQ(3, 9, 8020000))
+    (defined(__clang__) && !CLANG_PREREQ(3, 9, 8020000)) || \
+    defined(__INTEL_COMPILER)
 typedef unsigned long long  __v2du __attribute__((__vector_size__(16)));
 typedef unsigned int        __v4su __attribute__((__vector_size__(16)));
 typedef unsigned short      __v8hu __attribute__((__vector_size__(16)));
@@ -158,6 +159,12 @@ typedef unsigned short     __v16hu __attribute__((__vector_size__(32)));
 typedef unsigned char      __v32qu __attribute__((__vector_size__(32)));
 #endif
 
+#ifdef __INTEL_COMPILER
+typedef int   __v16si __attribute__((__vector_size__(64)));
+typedef short __v32hi __attribute__((__vector_size__(64)));
+typedef char  __v64qi __attribute__((__vector_size__(64)));
+#endif
+
 /* Newer gcc supports __BYTE_ORDER__.  Older gcc doesn't. */
 #ifdef __BYTE_ORDER__
 #  define CPU_IS_LITTLE_ENDIAN() (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
@@ -175,7 +182,16 @@ typedef unsigned char      __v32qu __attribute__((__vector_size__(32)));
 #  define bswap64	__builtin_bswap64
 #endif
 
-#if defined(__x86_64__) || defined(__i386__) || defined(__ARM_FEATURE_UNALIGNED) || defined(__powerpc64__)
+#if defined(__x86_64__) || defined(__i386__) || \
+    defined(__ARM_FEATURE_UNALIGNED) || defined(__powerpc64__) || \
+    /*
+     * For all compilation purposes, WebAssembly behaves like any other CPU
+     * instruction set. Even though WebAssembly engine might be running on top
+     * of different actual CPU architectures, the WebAssembly spec itself
+     * permits unaligned access and it will be fast on most of those platforms,
+     * and simulated at the engine level on others, so it's worth treating it
+     * as a CPU architecture with fast unaligned access.
+    */ defined(__wasm__)
 #  define UNALIGNED_ACCESS_IS_FAST 1
 #endif
 


=====================================
lib/arm/adler32_impl.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_ARM_ADLER32_IMPL_H
+#define LIB_ARM_ADLER32_IMPL_H
+
 #include "cpu_features.h"
 
 /* NEON implementation */
@@ -118,3 +121,5 @@ arch_select_adler32_func(void)
 	return NULL;
 }
 #endif /* DISPATCH */
+
+#endif /* LIB_ARM_ADLER32_IMPL_H */


=====================================
lib/arm/crc32_impl.h
=====================================
@@ -26,6 +26,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_ARM_CRC32_IMPL_H
+#define LIB_ARM_CRC32_IMPL_H
+
 #include "cpu_features.h"
 
 /* Implementation using ARM CRC32 instructions */
@@ -240,3 +243,5 @@ arch_select_crc32_func(void)
 	return NULL;
 }
 #endif /* DISPATCH */
+
+#endif /* LIB_ARM_CRC32_IMPL_H */


=====================================
lib/arm/matchfinder_impl.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_ARM_MATCHFINDER_IMPL_H
+#define LIB_ARM_MATCHFINDER_IMPL_H
+
 #ifdef __ARM_NEON
 #  include <arm_neon.h>
 static forceinline void
@@ -79,3 +82,5 @@ matchfinder_rebase_neon(mf_pos_t *data, size_t size)
 #define matchfinder_rebase matchfinder_rebase_neon
 
 #endif /* __ARM_NEON */
+
+#endif /* LIB_ARM_MATCHFINDER_IMPL_H */


=====================================
lib/bt_matchfinder.h
=====================================
@@ -64,6 +64,8 @@
  * ----------------------------------------------------------------------------
  */
 
+#ifndef LIB_BT_MATCHFINDER_H
+#define LIB_BT_MATCHFINDER_H
 
 #include "matchfinder_common.h"
 
@@ -357,3 +359,5 @@ bt_matchfinder_skip_position(struct bt_matchfinder *mf,
 					NULL,
 					false);
 }
+
+#endif /* LIB_BT_MATCHFINDER_H */


=====================================
lib/cpu_features_common.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_CPU_FEATURES_COMMON_H
+#define LIB_CPU_FEATURES_COMMON_H
+
 #if defined(TEST_SUPPORT__DO_NOT_USE) && !defined(FREESTANDING)
 #  define _GNU_SOURCE 1 /* for strdup() and strtok_r() */
 #  include <stdio.h>
@@ -81,3 +84,5 @@ disable_cpu_features_for_testing(u32 *features,
 {
 }
 #endif /* !TEST_SUPPORT__DO_NOT_USE */
+
+#endif /* LIB_CPU_FEATURES_COMMON_H */


=====================================
lib/hc_matchfinder.h
=====================================
@@ -106,6 +106,9 @@
  * ----------------------------------------------------------------------------
  */
 
+#ifndef LIB_HC_MATCHFINDER_H
+#define LIB_HC_MATCHFINDER_H
+
 #include "matchfinder_common.h"
 
 #define HC_MATCHFINDER_HASH3_ORDER	15
@@ -405,3 +408,5 @@ hc_matchfinder_skip_positions(struct hc_matchfinder * const restrict mf,
 
 	return in_next;
 }
+
+#endif /* LIB_HC_MATCHFINDER_H */


=====================================
lib/utils.c
=====================================
@@ -85,7 +85,8 @@ libdeflate_set_memory_allocator(void *(*malloc_func)(size_t),
  */
 #ifdef FREESTANDING
 #undef memset
-void *memset(void *s, int c, size_t n)
+void * __attribute__((weak))
+memset(void *s, int c, size_t n)
 {
 	u8 *p = s;
 	size_t i;
@@ -96,7 +97,8 @@ void *memset(void *s, int c, size_t n)
 }
 
 #undef memcpy
-void *memcpy(void *dest, const void *src, size_t n)
+void * __attribute__((weak))
+memcpy(void *dest, const void *src, size_t n)
 {
 	u8 *d = dest;
 	const u8 *s = src;
@@ -108,7 +110,8 @@ void *memcpy(void *dest, const void *src, size_t n)
 }
 
 #undef memmove
-void *memmove(void *dest, const void *src, size_t n)
+void * __attribute__((weak))
+memmove(void *dest, const void *src, size_t n)
 {
 	u8 *d = dest;
 	const u8 *s = src;
@@ -123,7 +126,8 @@ void *memmove(void *dest, const void *src, size_t n)
 }
 
 #undef memcmp
-int memcmp(const void *s1, const void *s2, size_t n)
+int __attribute__((weak))
+memcmp(const void *s1, const void *s2, size_t n)
 {
 	const u8 *p1 = s1;
 	const u8 *p2 = s2;


=====================================
lib/x86/adler32_impl.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_X86_ADLER32_IMPL_H
+#define LIB_X86_ADLER32_IMPL_H
+
 #include "cpu_features.h"
 
 /*
@@ -330,3 +333,5 @@ arch_select_adler32_func(void)
 	return NULL;
 }
 #endif /* DISPATCH */
+
+#endif /* LIB_X86_ADLER32_IMPL_H */


=====================================
lib/x86/crc32_impl.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_X86_CRC32_IMPL_H
+#define LIB_X86_CRC32_IMPL_H
+
 #include "cpu_features.h"
 
 /*
@@ -85,3 +88,5 @@ arch_select_crc32_func(void)
 	return NULL;
 }
 #endif /* DISPATCH */
+
+#endif /* LIB_X86_CRC32_IMPL_H */


=====================================
lib/x86/crc32_pclmul_template.h
=====================================
@@ -25,7 +25,7 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
-#include <wmmintrin.h>
+#include <immintrin.h>
 
 /*
  * CRC-32 folding with PCLMULQDQ.


=====================================
lib/x86/decompress_impl.h
=====================================
@@ -1,3 +1,6 @@
+#ifndef LIB_X86_DECOMPRESS_IMPL_H
+#define LIB_X86_DECOMPRESS_IMPL_H
+
 #include "cpu_features.h"
 
 /* Include the BMI2-optimized version? */
@@ -24,3 +27,5 @@ arch_select_decompress_func(void)
 	return NULL;
 }
 #endif /* DISPATCH */
+
+#endif /* LIB_X86_DECOMPRESS_IMPL_H */


=====================================
lib/x86/matchfinder_impl.h
=====================================
@@ -25,6 +25,9 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 
+#ifndef LIB_X86_MATCHFINDER_IMPL_H
+#define LIB_X86_MATCHFINDER_IMPL_H
+
 #ifdef __AVX2__
 #  include <immintrin.h>
 static forceinline void
@@ -115,3 +118,5 @@ matchfinder_rebase_sse2(mf_pos_t *data, size_t size)
 }
 #define matchfinder_rebase matchfinder_rebase_sse2
 #endif /* __SSE2__ */
+
+#endif /* LIB_X86_MATCHFINDER_IMPL_H */


=====================================
libdeflate.h
=====================================
@@ -10,8 +10,8 @@ extern "C" {
 #endif
 
 #define LIBDEFLATE_VERSION_MAJOR	1
-#define LIBDEFLATE_VERSION_MINOR	7
-#define LIBDEFLATE_VERSION_STRING	"1.7"
+#define LIBDEFLATE_VERSION_MINOR	8
+#define LIBDEFLATE_VERSION_STRING	"1.8"
 
 #include <stddef.h>
 #include <stdint.h>


=====================================
programs/benchmark.c
=====================================
@@ -29,21 +29,21 @@
 
 static const tchar *const optstring = T("0::1::2::3::4::5::6::7::8::9::C:D:eghs:VYZz");
 
-enum wrapper {
-	NO_WRAPPER,
-	ZLIB_WRAPPER,
-	GZIP_WRAPPER,
+enum format {
+	DEFLATE_FORMAT,
+	ZLIB_FORMAT,
+	GZIP_FORMAT,
 };
 
 struct compressor {
 	int level;
-	enum wrapper wrapper;
+	enum format format;
 	const struct engine *engine;
 	void *private;
 };
 
 struct decompressor {
-	enum wrapper wrapper;
+	enum format format;
 	const struct engine *engine;
 	void *private;
 };
@@ -75,10 +75,10 @@ libdeflate_engine_init_compressor(struct compressor *c)
 static size_t
 libdeflate_engine_compress_bound(struct compressor *c, size_t in_nbytes)
 {
-	switch (c->wrapper) {
-	case ZLIB_WRAPPER:
+	switch (c->format) {
+	case ZLIB_FORMAT:
 		return libdeflate_zlib_compress_bound(c->private, in_nbytes);
-	case GZIP_WRAPPER:
+	case GZIP_FORMAT:
 		return libdeflate_gzip_compress_bound(c->private, in_nbytes);
 	default:
 		return libdeflate_deflate_compress_bound(c->private, in_nbytes);
@@ -89,11 +89,11 @@ static size_t
 libdeflate_engine_compress(struct compressor *c, const void *in,
 			   size_t in_nbytes, void *out, size_t out_nbytes_avail)
 {
-	switch (c->wrapper) {
-	case ZLIB_WRAPPER:
+	switch (c->format) {
+	case ZLIB_FORMAT:
 		return libdeflate_zlib_compress(c->private, in, in_nbytes,
 						out, out_nbytes_avail);
-	case GZIP_WRAPPER:
+	case GZIP_FORMAT:
 		return libdeflate_gzip_compress(c->private, in, in_nbytes,
 						out, out_nbytes_avail);
 	default:
@@ -119,11 +119,11 @@ static bool
 libdeflate_engine_decompress(struct decompressor *d, const void *in,
 			     size_t in_nbytes, void *out, size_t out_nbytes)
 {
-	switch (d->wrapper) {
-	case ZLIB_WRAPPER:
+	switch (d->format) {
+	case ZLIB_FORMAT:
 		return !libdeflate_zlib_decompress(d->private, in, in_nbytes,
 						   out, out_nbytes, NULL);
-	case GZIP_WRAPPER:
+	case GZIP_FORMAT:
 		return !libdeflate_gzip_decompress(d->private, in, in_nbytes,
 						   out, out_nbytes, NULL);
 	default:
@@ -154,13 +154,13 @@ static const struct engine libdeflate_engine = {
 /******************************************************************************/
 
 static int
-get_libz_window_bits(enum wrapper wrapper)
+get_libz_window_bits(enum format format)
 {
 	const int windowBits = 15;
-	switch (wrapper) {
-	case ZLIB_WRAPPER:
+	switch (format) {
+	case ZLIB_FORMAT:
 		return windowBits;
-	case GZIP_WRAPPER:
+	case GZIP_FORMAT:
 		return windowBits + 16;
 	default:
 		return -windowBits;
@@ -187,7 +187,7 @@ libz_engine_init_compressor(struct compressor *c)
 	z->zfree = NULL;
 	z->opaque = NULL;
 	if (deflateInit2(z, c->level, Z_DEFLATED,
-			 get_libz_window_bits(c->wrapper),
+			 get_libz_window_bits(c->format),
 			 8, Z_DEFAULT_STRATEGY) != Z_OK)
 	{
 		msg("unable to initialize deflater");
@@ -247,7 +247,7 @@ libz_engine_init_decompressor(struct decompressor *d)
 	z->zalloc = NULL;
 	z->zfree = NULL;
 	z->opaque = NULL;
-	if (inflateInit2(z, get_libz_window_bits(d->wrapper)) != Z_OK) {
+	if (inflateInit2(z, get_libz_window_bits(d->format)) != Z_OK) {
 		msg("unable to initialize inflater");
 		free(z);
 		return false;
@@ -318,11 +318,11 @@ name_to_engine(const tchar *name)
 /******************************************************************************/
 
 static bool
-compressor_init(struct compressor *c, int level, enum wrapper wrapper,
+compressor_init(struct compressor *c, int level, enum format format,
 		const struct engine *engine)
 {
 	c->level = level;
-	c->wrapper = wrapper;
+	c->format = format;
 	c->engine = engine;
 	return engine->init_compressor(c);
 }
@@ -348,10 +348,10 @@ compressor_destroy(struct compressor *c)
 }
 
 static bool
-decompressor_init(struct decompressor *d, enum wrapper wrapper,
+decompressor_init(struct decompressor *d, enum format format,
 		  const struct engine *engine)
 {
-	d->wrapper = wrapper;
+	d->format = format;
 	d->engine = engine;
 	return engine->init_decompressor(d);
 }
@@ -401,11 +401,11 @@ show_usage(FILE *fp)
 "  -C ENGINE compression engine\n"
 "  -D ENGINE decompression engine\n"
 "  -e        allow chunks to be expanded (implied by -0)\n"
-"  -g        use gzip wrapper\n"
+"  -g        use gzip format instead of raw DEFLATE\n"
 "  -h        print this help\n"
 "  -s SIZE   chunk size\n"
 "  -V        show version and legal information\n"
-"  -z        use zlib wrapper\n"
+"  -z        use zlib format instead of raw DEFLATE\n"
 "\n", prog_invocation_name);
 
 	show_available_engines(fp);
@@ -542,7 +542,7 @@ tmain(int argc, tchar *argv[])
 {
 	u32 chunk_size = 1048576;
 	int level = 6;
-	enum wrapper wrapper = NO_WRAPPER;
+	enum format format = DEFLATE_FORMAT;
 	const struct engine *compress_engine = &DEFAULT_ENGINE;
 	const struct engine *decompress_engine = &DEFAULT_ENGINE;
 	bool allow_expansion = false;
@@ -595,7 +595,7 @@ tmain(int argc, tchar *argv[])
 			allow_expansion = true;
 			break;
 		case 'g':
-			wrapper = GZIP_WRAPPER;
+			format = GZIP_FORMAT;
 			break;
 		case 'h':
 			show_usage(stdout);
@@ -617,7 +617,7 @@ tmain(int argc, tchar *argv[])
 			decompress_engine = &libz_engine;
 			break;
 		case 'z':
-			wrapper = ZLIB_WRAPPER;
+			format = ZLIB_FORMAT;
 			break;
 		default:
 			show_usage(stderr);
@@ -632,9 +632,9 @@ tmain(int argc, tchar *argv[])
 		allow_expansion = true;
 
 	ret = -1;
-	if (!compressor_init(&compressor, level, wrapper, compress_engine))
+	if (!compressor_init(&compressor, level, format, compress_engine))
 		goto out;
-	if (!decompressor_init(&decompressor, wrapper, decompress_engine))
+	if (!decompressor_init(&decompressor, format, decompress_engine))
 		goto out;
 
 	if (allow_expansion)
@@ -660,12 +660,11 @@ tmain(int argc, tchar *argv[])
 				argv[i] = NULL;
 	}
 
-	printf("Benchmarking DEFLATE compression:\n");
+	printf("Benchmarking %s compression:\n",
+	       format == DEFLATE_FORMAT ? "DEFLATE" :
+	       format == ZLIB_FORMAT ? "zlib" : "gzip");
 	printf("\tCompression level: %d\n", level);
 	printf("\tChunk size: %"PRIu32"\n", chunk_size);
-	printf("\tWrapper: %s\n",
-	       wrapper == NO_WRAPPER ? "None" :
-	       wrapper == ZLIB_WRAPPER ? "zlib" : "gzip");
 	printf("\tCompression engine: %"TS"\n", compress_engine->name);
 	printf("\tDecompression engine: %"TS"\n", decompress_engine->name);
 


=====================================
programs/gzip.c
=====================================
@@ -43,11 +43,12 @@ struct options {
 	bool decompress;
 	bool force;
 	bool keep;
+	bool test;
 	int compression_level;
 	const tchar *suffix;
 };
 
-static const tchar *const optstring = T("1::2::3::4::5::6::7::8::9::cdfhknS:V");
+static const tchar *const optstring = T("1::2::3::4::5::6::7::8::9::cdfhknS:tV");
 
 static void
 show_usage(FILE *fp)
@@ -66,6 +67,7 @@ show_usage(FILE *fp)
 "  -h        print this help\n"
 "  -k        don't delete input files\n"
 "  -S SUF    use suffix SUF instead of .gz\n"
+"  -t        test file integrity\n"
 "  -V        show version and legal information\n",
 	prog_invocation_name);
 }
@@ -183,7 +185,8 @@ load_u32_gzip(const u8 *p)
 
 static int
 do_decompress(struct libdeflate_decompressor *decompressor,
-	      struct file_stream *in, struct file_stream *out)
+	      struct file_stream *in, struct file_stream *out,
+	      const struct options *options)
 {
 	const u8 *compressed_data = in->mmap_mem;
 	size_t compressed_size = in->mmap_size;
@@ -258,9 +261,11 @@ do_decompress(struct libdeflate_decompressor *decompressor,
 			goto out;
 		}
 
-		ret = full_write(out, uncompressed_data, actual_out_nbytes);
-		if (ret != 0)
-			goto out;
+		if (!options->test) {
+			ret = full_write(out, uncompressed_data, actual_out_nbytes);
+			if (ret != 0)
+				goto out;
+		}
 
 		compressed_data += actual_in_nbytes;
 		compressed_size -= actual_in_nbytes;
@@ -425,7 +430,7 @@ decompress_file(struct libdeflate_decompressor *decompressor, const tchar *path,
 	if (ret != 0)
 		goto out_close_out;
 
-	ret = do_decompress(decompressor, &in, &out);
+	ret = do_decompress(decompressor, &in, &out, options);
 	if (ret != 0)
 		goto out_close_out;
 
@@ -534,6 +539,7 @@ tmain(int argc, tchar *argv[])
 	options.decompress = is_gunzip();
 	options.force = false;
 	options.keep = false;
+	options.test = false;
 	options.compression_level = 6;
 	options.suffix = T(".gz");
 
@@ -583,6 +589,17 @@ tmain(int argc, tchar *argv[])
 				return 1;
 			}
 			break;
+		case 't':
+			options.test = true;
+			options.decompress = true;
+			options.to_stdout = true;
+			/*
+			 * -t behaves just like the more commonly used -c
+			 * option, except that -t doesn't actually write
+			 * anything.  For ease of implementation, just pretend
+			 * that -c was specified too.
+			 */
+			break;
 		case 'V':
 			show_version();
 			return 0;


=====================================
programs/prog_util.c
=====================================
@@ -186,7 +186,7 @@ xopen_for_read(const tchar *path, bool symlink_ok, struct file_stream *strm)
 	}
 
 #if defined(HAVE_POSIX_FADVISE) && (O_SEQUENTIAL == 0)
-	posix_fadvise(strm->fd, 0, 0, POSIX_FADV_SEQUENTIAL);
+	(void)posix_fadvise(strm->fd, 0, 0, POSIX_FADV_SEQUENTIAL);
 #endif
 
 	return 0;
@@ -347,7 +347,7 @@ map_file_contents(struct file_stream *strm, u64 size)
 	}
 
 #ifdef HAVE_POSIX_MADVISE
-	posix_madvise(strm->mmap_mem, size, POSIX_MADV_SEQUENTIAL);
+	(void)posix_madvise(strm->mmap_mem, size, POSIX_MADV_SEQUENTIAL);
 #endif
 	strm->mmap_token = strm; /* anything that's not NULL */
 


=====================================
programs/prog_util.h
=====================================
@@ -38,6 +38,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#ifndef _WIN32
+#  include <sys/types.h>
+#endif
 
 #include "../common/common_defs.h"
 


=====================================
scripts/android_tests.sh
=====================================
@@ -21,19 +21,26 @@ EOF
 	exit 1
 fi
 
+CLEANUP_CMDS=()
+cleanup() {
+	for cmd in "${CLEANUP_CMDS[@]}"; do
+		eval "$cmd"
+	done
+}
+trap cleanup EXIT
+
 # Use TESTDATA if specified in environment, else generate it.
 if [ -z "${TESTDATA:-}" ]; then
 	# Generate default TESTDATA file.
-	TESTDATA=$(mktemp -t libdeflate_testdata.XXXXXXX)
+	TESTDATA=$(mktemp -t libdeflate_testdata.XXXXXXXXXX)
 	export TESTDATA
-	trap 'rm -f "$TESTDATA"' EXIT
+	CLEANUP_CMDS+=("rm -f '$TESTDATA'")
 	find . '(' -name '*.c' -o -name '*.h' -o -name '*.sh' ')' \
 		-exec cat '{}' ';' | head -c 1000000 > "$TESTDATA"
 fi
 
-# Create a temporary file.
-TMPFILE=$(mktemp -t libdeflate_tmpfile.XXXXXX)
-trap 'rm -f "$TMPFILE"' EXIT
+TMPDIR=$(mktemp -d -t libdeflate_test.XXXXXXXXX)
+CLEANUP_CMDS+=("rm -r '$TMPDIR'")
 
 android_build_and_test() {
 	echo "Running Android tests with $*"
@@ -45,10 +52,10 @@ android_build_and_test() {
 
 	# Note: adb shell always returns 0, even if the shell command fails...
 	adb shell "cd /data/local/tmp && WRAPPER= TESTDATA=$(basename "$TESTDATA") sh exec_tests.sh" \
-		> "$TMPFILE"
-	if ! grep -q "exec_tests finished successfully" "$TMPFILE"; then
+		> "$TMPDIR/adb.out"
+	if ! grep -q "exec_tests finished successfully" "$TMPDIR/adb.out"; then
 		echo 1>&2 "Android test failure!  adb shell output:"
-		cat "$TMPFILE"
+		cat "$TMPDIR/adb.out"
 		exit 1
 	fi
 }


=====================================
scripts/gzip_tests.sh
=====================================
@@ -363,19 +363,21 @@ assert_skipped gunzip 1.gz 2.gz
 cmp 2 file
 
 
-begin_test 'Multiple files, continue on error'
-cp file 1
-cp file 2
-chmod a-r 1
-assert_error 'Permission denied' gzip 1 2
-[ ! -e 1.gz ]
-cmp file <(gunzip -c 2.gz)
-rm -f 1
-cp 2.gz 1.gz
-chmod a-r 1.gz
-assert_error 'Permission denied' gunzip 1.gz 2.gz
-[ ! -e 1 ]
-cmp 2 file
+if (( $(id -u) != 0 )); then
+	begin_test 'Multiple files, continue on error'
+	cp file 1
+	cp file 2
+	chmod a-r 1
+	assert_error 'Permission denied' gzip 1 2
+	[ ! -e 1.gz ]
+	cmp file <(gunzip -c 2.gz)
+	rm -f 1
+	cp 2.gz 1.gz
+	chmod a-r 1.gz
+	assert_error 'Permission denied' gunzip 1.gz 2.gz
+	[ ! -e 1 ]
+	cmp 2 file
+fi
 
 
 begin_test 'Compressing empty file'
@@ -393,10 +395,8 @@ echo 1 > foo.gz
 assert_error '\<not in gzip format\>' gunzip foo.gz
 echo abcdefgh > foo.gz
 assert_error '\<not in gzip format\>' gunzip foo.gz
-xxd -r > foo.gz <<-EOF
-00000000: 1f8b 0800 0000 0000 00ff 4b4c 4a4e 4924  ..........KLJNI$
-00000010: 1673 0100 6c5b a262 2e00 0000            .s..l[.b....
-EOF
+echo -ne '\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x4b\x4c\x4a\x4e\x49\x24\x16\x73\x01\x00\x6c\x5b\xa2\x62\x2e\x00\x00\x00' \
+	> foo.gz
 assert_error '\<(not in gzip format|crc error)\>' gunzip foo.gz
 
 
@@ -463,6 +463,26 @@ for prog in gzip gunzip; do
 done
 
 
+begin_test '-t (test) option works'
+good_files=(
+'H4sIAAAAAAAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+86ehsAAAA='
+'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9LLVIoAUrnJFZVKqTkp+txAQBqzFDrLQAAAA==')
+bad_files=(
+'H4sIAO1YYmAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+46ehsAAAA='
+'H4sIAO1YYmAAA3PMSVTITVTIzi85VABTIJ5jzpGZelwAX+86ehsAAAA='
+'H4sIAAAAAAAAA3PMSVTITVTIzi9JVABTIJ5jzpGZelwAX+86ehsBAAA='
+'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9LLVIogUrnJFZVKqTkp+txAQBqzFDrLQAAAA=='
+'H4sIAAAAAAAAAwvJSFUoLM1MzlZIKsovz1NIy69QyCrNLShWyC9L')
+for contents in "${good_files[@]}"; do
+	echo "$contents" | base64 -d | gzip -t
+done
+for contents in "${bad_files[@]}"; do
+	echo "$contents" | base64 -d > file
+	assert_error '\<invalid compressed data|file corrupt|unexpected end of file|Out of memory\>' \
+		gzip -t file
+done
+
+
 begin_test 'Version information'
 gzip -V | grep -q Copyright
 gunzip -V | grep -q Copyright


=====================================
scripts/make-windows-releases.sh
=====================================
@@ -12,9 +12,8 @@ for arch in 'i686' 'x86_64'; do
 	cp libdeflate.{dll,lib,def} libdeflatestatic.lib libdeflate.h ./*.exe \
 		"$dir"
 	${arch}-w64-mingw32-strip "$dir/libdeflate.dll" "$dir"/*.exe
-	for file in COPYING NEWS; do
+	for file in COPYING NEWS.md README.md; do
 		sed < $file > "$dir/${file}.txt" -e 's/$/\r/g'
 	done
-	sed < README.md > "$dir/README.md" -e 's/$/\r/g'
 	(cd "$dir" && zip -r "../${dir}.zip" .)
 done


=====================================
scripts/run_tests.sh
=====================================
@@ -16,18 +16,26 @@ fi
 # Use CFLAGS if specified in environment.
 : "${CFLAGS:=}"
 
+CLEANUP_CMDS=()
+cleanup() {
+	for cmd in "${CLEANUP_CMDS[@]}"; do
+		eval "$cmd"
+	done
+}
+trap cleanup EXIT
+
 # Use TESTDATA if specified in environment, else generate it.
 if [ -z "${TESTDATA:-}" ]; then
 	# Generate default TESTDATA file.
 	TESTDATA=$(mktemp -t libdeflate_testdata.XXXXXXXXXX)
 	export TESTDATA
-	trap 'rm -f "$TESTDATA"' EXIT
+	CLEANUP_CMDS+=("rm -f '$TESTDATA'")
 	find . '(' -name '*.c' -o -name '*.h' -o -name '*.sh' ')' \
 		-exec cat '{}' ';' | head -c 1000000 > "$TESTDATA"
 fi
 
 TMPDIR=$(mktemp -d -t libdeflate_test.XXXXXXXXX)
-trap 'rm -r "$TMPDIR"' EXIT
+CLEANUP_CMDS+=("rm -r '$TMPDIR'")
 
 MAKE="make -j$(getconf _NPROCESSORS_ONLN)"
 
@@ -35,12 +43,14 @@ CC_VERSION=$($CC --version | head -1)
 
 ARCH=$(uname -m)
 
-# Allow setting DISABLE_ASAN=1 in the environment to disable the ASAN tests.
-if [ "${DISABLE_ASAN:-}" = "1" ]; then
-	DISABLE_ASAN=true
-else
-	DISABLE_ASAN=false
-fi
+for skip in SKIP_FREESTANDING SKIP_VALGRIND SKIP_UBSAN SKIP_ASAN SKIP_CFI \
+	    SKIP_SHARED_LIB; do
+	if [ "${!skip:-}" = "1" ]; then
+		eval $skip=true
+	else
+		eval $skip=false
+	fi
+done
 
 ###############################################################################
 
@@ -183,8 +193,12 @@ gzip_tests() {
 do_run_tests() {
 	build_and_run_tests "$@"
 	if [ "${1:-}" != "--quick" ]; then
-		build_and_run_tests FREESTANDING=1
-		verify_freestanding_build
+		if $SKIP_FREESTANDING; then
+			log "Skipping freestanding build tests due to SKIP_FREESTANDING=1"
+		else
+			build_and_run_tests FREESTANDING=1
+			verify_freestanding_build
+		fi
 	fi
 	gzip_tests "$@"
 }
@@ -204,6 +218,10 @@ check_symbol_prefixes() {
 }
 
 test_use_shared_lib() {
+	if $SKIP_SHARED_LIB; then
+		log "Skipping USE_SHARED_LIB=1 tests due to SKIP_SHARED_LIB=1"
+		return
+	fi
 	log "Testing USE_SHARED_LIB=1"
 	$MAKE gzip > /dev/null
 	if ldd gzip | grep -q 'libdeflate.so'; then
@@ -256,7 +274,9 @@ run_tests() {
 
 	# Need valgrind 3.9.0 for '--errors-for-leak-kinds=all'
 	# Need valgrind 3.12.0 for armv8 crypto and crc instructions
-	if valgrind_version_at_least 3.12.0; then
+	if $SKIP_VALGRIND; then
+		log "Skipping valgrind tests due to SKIP_VALGRIND=1"
+	elif valgrind_version_at_least 3.12.0; then
 		begin "Running tests with Valgrind"
 		WRAPPER="valgrind --quiet --error-exitcode=100 --leak-check=full --errors-for-leak-kinds=all" \
 			do_run_tests --quick
@@ -264,7 +284,9 @@ run_tests() {
 	fi
 
 	cflags=("-fsanitize=undefined" "-fno-sanitize-recover=undefined")
-	if cflags_supported "${cflags[@]}"; then
+	if $SKIP_UBSAN; then
+		log "Skipping UBSAN tests due to SKIP_UBSAN=1"
+	elif cflags_supported "${cflags[@]}"; then
 		begin "Running tests with UBSAN"
 		CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests --quick
 		end
@@ -273,8 +295,8 @@ run_tests() {
 	fi
 
 	cflags=("-fsanitize=address" "-fno-sanitize-recover=address")
-	if $DISABLE_ASAN; then
-		log "Skipping ASAN tests because DISABLE_ASAN=1 was set"
+	if $SKIP_ASAN; then
+		log "Skipping ASAN tests due to SKIP_ASAN=1"
 	elif cflags_supported "${cflags[@]}"; then
 		begin "Running tests with ASAN"
 		CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests --quick
@@ -285,9 +307,11 @@ run_tests() {
 
 	cflags=("-fsanitize=cfi" "-fno-sanitize-recover=cfi" "-flto"
 		"-fvisibility=hidden")
-	if cflags_supported "${cflags[@]}"; then
+	if $SKIP_CFI; then
+		log "Skipping CFI tests due to SKIP_CFI=1"
+	elif cflags_supported "${cflags[@]}"; then
 		begin "Running tests with CFI"
-		CFLAGS="$CFLAGS ${cflags[*]}" do_run_tests --quick
+		CFLAGS="$CFLAGS ${cflags[*]}" AR=llvm-ar do_run_tests --quick
 		end
 	else
 		log "Skipping CFI tests because compiler ($CC_VERSION) doesn't support CFI"



View it on GitLab: https://salsa.debian.org/med-team/libdeflate/-/commit/04e29cc84e95d1dbd2c583a0387d2a9a51971d93

-- 
View it on GitLab: https://salsa.debian.org/med-team/libdeflate/-/commit/04e29cc84e95d1dbd2c583a0387d2a9a51971d93
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20211010/9e4acf3f/attachment-0001.htm>


More information about the debian-med-commit mailing list