aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2025-03-21 17:19:45 -0700
committerMark Adler <madler@alumni.caltech.edu>2025-05-13 18:00:03 -0700
commit473f78532aed8f5a8d55cd6e7b305160db9cf742 (patch)
tree300c72bc9ee482317d206c0864e4a770559d215d
parent783886350b775fbf852947bfff103992856075f6 (diff)
downloadzlib-473f78532aed8f5a8d55cd6e7b305160db9cf742.tar.gz
zlib-473f78532aed8f5a8d55cd6e7b305160db9cf742.tar.bz2
zlib-473f78532aed8f5a8d55cd6e7b305160db9cf742.zip
Fix bug in inflatePrime() for 16-bit ints.
Also elaborate on the inflatePrime() error return in zlib.h, and assure that data_type is correct after initialization and a Z_NEED_DICT return.
-rw-r--r--inflate.c3
-rw-r--r--zlib.h28
2 files changed, 21 insertions, 10 deletions
diff --git a/inflate.c b/inflate.c
index d677995..d566831 100644
--- a/inflate.c
+++ b/inflate.c
@@ -110,6 +110,7 @@ int ZEXPORT inflateResetKeep(z_streamp strm) {
110 state = (struct inflate_state FAR *)strm->state; 110 state = (struct inflate_state FAR *)strm->state;
111 strm->total_in = strm->total_out = state->total = 0; 111 strm->total_in = strm->total_out = state->total = 0;
112 strm->msg = Z_NULL; 112 strm->msg = Z_NULL;
113 strm->data_type = 0;
113 if (state->wrap) /* to support ill-conceived Java test suite */ 114 if (state->wrap) /* to support ill-conceived Java test suite */
114 strm->adler = state->wrap & 1; 115 strm->adler = state->wrap & 1;
115 state->mode = HEAD; 116 state->mode = HEAD;
@@ -234,7 +235,7 @@ int ZEXPORT inflatePrime(z_streamp strm, int bits, int value) {
234 } 235 }
235 if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR; 236 if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
236 value &= (1L << bits) - 1; 237 value &= (1L << bits) - 1;
237 state->hold += (unsigned)value << state->bits; 238 state->hold += (unsigned long)value << state->bits;
238 state->bits += (uInt)bits; 239 state->bits += (uInt)bits;
239 return Z_OK; 240 return Z_OK;
240} 241}
diff --git a/zlib.h b/zlib.h
index 1a57127..85d7999 100644
--- a/zlib.h
+++ b/zlib.h
@@ -445,7 +445,7 @@ ZEXTERN int ZEXPORT inflate(z_streamp strm, int flush);
445 445
446 The Z_BLOCK option assists in appending to or combining deflate streams. 446 The Z_BLOCK option assists in appending to or combining deflate streams.
447 To assist in this, on return inflate() always sets strm->data_type to the 447 To assist in this, on return inflate() always sets strm->data_type to the
448 number of unused bits in the last byte taken from strm->next_in, plus 64 if 448 number of unused bits in the input taken from strm->next_in, plus 64 if
449 inflate() is currently decoding the last block in the deflate stream, plus 449 inflate() is currently decoding the last block in the deflate stream, plus
450 128 if inflate() returned immediately after decoding an end-of-block code or 450 128 if inflate() returned immediately after decoding an end-of-block code or
451 decoding the complete header up to just before the first byte of the deflate 451 decoding the complete header up to just before the first byte of the deflate
@@ -1006,13 +1006,15 @@ ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
1006 int bits, 1006 int bits,
1007 int value); 1007 int value);
1008/* 1008/*
1009 This function inserts bits in the inflate input stream. The intent is 1009 This function inserts bits in the inflate input stream. The intent is to
1010 that this function is used to start inflating at a bit position in the 1010 use inflatePrime() to start inflating at a bit position in the middle of a
1011 middle of a byte. The provided bits will be used before any bytes are used 1011 byte. The provided bits will be used before any bytes are used from
1012 from next_in. This function should only be used with raw inflate, and 1012 next_in. This function should be used with raw inflate, before the first
1013 should be used before the first inflate() call after inflateInit2() or 1013 inflate() call, after inflateInit2() or inflateReset(). It can also be used
1014 inflateReset(). bits must be less than or equal to 16, and that many of the 1014 after an inflate() return indicates the end of a deflate block or header
1015 least significant bits of value will be inserted in the input. 1015 when using Z_BLOCK. bits must be less than or equal to 16, and that many of
1016 the least significant bits of value will be inserted in the input. The
1017 other bits in value can be non-zero, and will be ignored.
1016 1018
1017 If bits is negative, then the input stream bit buffer is emptied. Then 1019 If bits is negative, then the input stream bit buffer is emptied. Then
1018 inflatePrime() can be called again to put bits in the buffer. This is used 1020 inflatePrime() can be called again to put bits in the buffer. This is used
@@ -1020,7 +1022,15 @@ ZEXTERN int ZEXPORT inflatePrime(z_streamp strm,
1020 to feeding inflate codes. 1022 to feeding inflate codes.
1021 1023
1022 inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source 1024 inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
1023 stream state was inconsistent. 1025 stream state was inconsistent, or if bits is out of range. If inflate was
1026 in the middle of processing a header, trailer, or stored block lengths, then
1027 it is possible for there to be only eight bits available in the bit buffer.
1028 In that case, bits > 8 is considered out of range. However, when used as
1029 outlined above, there will always be 16 bits available in the buffer for
1030 insertion. As noted in its documentation above, inflate records the number
1031 of bits in the bit buffer on return in data_type. 32 minus that is the
1032 number of bits available for insertion. inflatePrime does not update
1033 data_type with the new number of bits in buffer.
1024*/ 1034*/
1025 1035
1026ZEXTERN long ZEXPORT inflateMark(z_streamp strm); 1036ZEXTERN long ZEXPORT inflateMark(z_streamp strm);