Mark Adler [Tue, 4 Oct 2016 05:33:26 +0000 (22:33 -0700)]
Note the violation of the strict aliasing rule in crc32.c.
See the comment for more details. This is in response to an issue
raised as a result of a security audit of the zlib code by Trail
of Bits and TrustInSoft, in support of the Mozilla Foundation.
Mark Adler [Thu, 29 Sep 2016 03:20:25 +0000 (20:20 -0700)]
Avoid pre-decrement of pointer in big-endian CRC calculation.
There was a small optimization for PowerPCs to pre-increment a
pointer when accessing a word, instead of post-incrementing. This
required prefacing the loop with a decrement of the pointer,
possibly pointing before the object passed. This is not compliant
with the C standard, for which decrementing a pointer before its
allocated memory is undefined. When tested on a modern PowerPC
with a modern compiler, the optimization no longer has any effect.
Due to all that, and per the recommendation of a security audit of
the zlib code by Trail of Bits and TrustInSoft, in support of the
Mozilla Foundation, this "optimization" was removed, in order to
avoid the possibility of undefined behavior.
Mark Adler [Thu, 22 Sep 2016 06:35:50 +0000 (23:35 -0700)]
Remove offset pointer optimization in inftrees.c.
inftrees.c was subtracting an offset from a pointer to an array,
in order to provide a pointer that allowed indexing starting at
the offset. This is not compliant with the C standard, for which
the behavior of a pointer decremented before its allocated memory
is undefined. Per the recommendation of a security audit of the
zlib code by Trail of Bits and TrustInSoft, in support of the
Mozilla Foundation, this tiny optimization was removed, in order
to avoid the possibility of undefined behavior.
Mark Adler [Thu, 22 Sep 2016 05:25:21 +0000 (22:25 -0700)]
Use post-increment only in inffast.c.
An old inffast.c optimization turns out to not be optimal anymore
with modern compilers, and furthermore was not compliant with the
C standard, for which decrementing a pointer before its allocated
memory is undefined. Per the recommendation of a security audit of
the zlib code by Trail of Bits and TrustInSoft, in support of the
Mozilla Foundation, this "optimization" was removed, in order to
avoid the possibility of undefined behavior.
Mark Adler [Wed, 21 Sep 2016 01:49:21 +0000 (18:49 -0700)]
Add option to not compute or check check values.
The undocumented (except in these commit comments) function
inflateValidate(strm, check) can be called after an inflateInit(),
inflateInit2(), or inflateReset2() with check equal to zero to
turn off the check value (CRC-32 or Adler-32) computation and
comparison. Calling with check not equal to zero turns checking
back on. This should only be called immediately after the init or
reset function. inflateReset() does not change the state, so a
previous inflateValidate() setting will remain in effect.
This also turns off validation of the gzip header CRC when
present.
This should only be used when a zlib or gzip stream has already
been checked, and repeated decompressions of the same stream no
longer need to be validated.
Mika Lindqvist [Sun, 27 Mar 2016 12:02:54 +0000 (15:02 +0300)]
Merge insert_string and bulk_insert_str.
** Partial merge of this commit, based on a8c94e9f5a3b9d3c62182bcf84e72304a3c1a6e5
Excludes changes to fill_window_sse.c, changes to fill_window_c() in deflate.c
and several unrelated changes in the commit.
Daniel Axtens [Wed, 29 Apr 2015 06:20:37 +0000 (16:20 +1000)]
Add test for CVE-2004-0797
CVE-2004-0797[0] occured when an error was detected but no action
was taken --- that is, execution was allowed to continue.
One of the tests for CVE-2005-2096 actually hit the code path that
was fixed in the patch for CVE-2004-0797.
This occured because all the fuzzing was done on zlib 1.2.1, and
zlib 1.2.2 fixed this bug but not the 2005 CVEs. It was detected by
running the test cases against zlib 1.2.2.
The relevant bits of the zlib 1.2.2 patch are [1] and [2].
Daniel Axtens [Wed, 29 Apr 2015 04:56:57 +0000 (14:56 +1000)]
Add test cases for CVE-2005-1849 and CVE-2005-2096
CVE-2005-1849[0] is an overflow of a fixed size buffer defined in
inftrees.h
CVE-2005-2096[1] is an overflow caused by insufficient input
validation of code trees[2].
This makes sure we don't accidentally reintroduce them.
zlib-1.2.1 was download and fuzz tested using AFL[3]. The crashing
cases were discovered. A patch for 1849 was then applied, and used to
determine which cases hit only that bug, and which ones hit 2096.
Daniel Axtens [Mon, 27 Apr 2015 06:17:21 +0000 (16:17 +1000)]
Add test for CVE-2002-0059
CVE-2002-0059 was a double free in inflation. [0]
This makes sure we don't accidentally reintroduce it.
zlib-1.1.3 was download and fuzz tested using AFL[1].
This crashing case (test.gz) was discovered, and using gdb it was
confirmed to be a double free in the expected place.
The test script looks for a normal error exit (status code 1),
and fails if any other code is returned.
Daniel Axtens [Mon, 27 Apr 2015 05:49:43 +0000 (15:49 +1000)]
Add test for CVE-2003-0107
CVE-2003-0107[0] was a bug where zlib 1.1.4 failed to validate whether
arguments to gzprintf() fit within an internal buffer.
We should make sure that in refactoring we don't regress. Therefore,
build the sample code supplied in the original report [1], and check
if it crashes.
Daniel Axtens [Wed, 29 Apr 2015 05:35:04 +0000 (15:35 +1000)]
Properly bail out when a test fails.
At an earlier point in development, shared libs were failing on Travis
but the overall build was succeeding. Stop that from happening by
bailing out harder.
Add support for internal attribute, the advantage of this over hidden
is for example that the compiler can safely assume that pointers to
functions declared internal can never be passed externally.
This allows the compiler to consider optimizations otherwise impossible.
Evan Nemerson [Tue, 15 Mar 2016 03:48:46 +0000 (20:48 -0700)]
Fix endianness-detection code on Solaris 11.
Solaris doesn't have sys/endian.h or endian.h, it has sys/byteorder.h,
which doesn't define BYTE_ORDER, it defines either _LITTLE_ENDIAN or
_BIG_ENDIAN.
Mark Adler [Fri, 27 Nov 2015 06:52:25 +0000 (22:52 -0800)]
Fix bug that accepted invalid zlib header when windowBits is zero.
When windowBits is zero, the size of the sliding window comes from
the zlib header. The allowed values of the four-bit field are
0..7, but when windowBits is zero, values greater than 7 are
permitted and acted upon, resulting in large, mostly unused memory
allocations. This fix rejects such invalid zlib headers.
Mark Adler [Sun, 4 Oct 2015 18:45:00 +0000 (11:45 -0700)]
Use a consistent and more modern approach to not use a parameter.
A remarkably creative and diverse set of approaches to letting the
compiler know that opaque was being used when it wasn't is changed
by this commit to the more standard (void)opaque.
Mark Adler [Thu, 24 Apr 2014 23:45:36 +0000 (19:45 -0400)]
Assure that gzoffset() is correct when appending.
An open() with O_APPEND followed by an lseek() to determine the
position will return zero for a non-empty file, even though the
next write will start at the end of the file. This commit works
around that by doing an lseek() to the end when appending.
Mark Adler [Sun, 2 Aug 2015 07:02:07 +0000 (00:02 -0700)]
Align deflateParams() and its documentation in zlib.h.
This updates the documentation to reflect the behavior of
deflateParams() when it is not able to compress all of the input
data provided so far due to insufficient output space. It also
assures that data provided is compressed before the parameter
changes, even if at the beginning of the stream.
Mark Adler [Wed, 29 Jul 2015 04:41:20 +0000 (21:41 -0700)]
Fix inflateInit2() bug when windowBits is 16 or 32.
A windowBits value of 0, 16, or 32 gets the window bits from the
zlib header. However there is no zlib header for 16, or for 32
when the input is gzip. This commit sets the window bits for
inflate to 15 if a gzip stream is detected and windowBits was 16
or 32.