*strm->next_out = (unsigned char)state->bi_buf;
/* Honor history and check value */
param->nt = 0;
- param->cv = state->wrap == 2 ? ZSWAP32(state->crc_fold.value) : strm->adler;
+ if (state->wrap == 1)
+ param->cv = strm->adler;
+ else if (state->wrap == 2)
+ param->cv = ZSWAP32(state->crc_fold.value);
/* When opening a block, choose a Huffman-Table Type */
if (!param->bcf) {
state->bi_buf = 0; /* Avoid accessing next_out */
else
state->bi_buf = *strm->next_out & ((1 << state->bi_valid) - 1);
- if (state->wrap == 2)
- state->crc_fold.value = ZSWAP32(param->cv);
- else
+ if (state->wrap == 1)
strm->adler = param->cv;
+ else if (state->wrap == 2)
+ state->crc_fold.value = ZSWAP32(param->cv);
/* Unmask the input data */
strm->avail_in += masked_avail_in;
}
/* Translate stream to parameter block */
- param->cvt = state->flags ? CVT_CRC32 : CVT_ADLER32;
+ param->cvt = ((state->wrap & 4) && state->flags) ? CVT_CRC32 : CVT_ADLER32;
param->sbb = state->bits;
if (param->hl)
param->nt = 0; /* Honor history for the first block */
- param->cv = state->flags ? ZSWAP32(state->check) : state->check;
+ if (state->wrap & 4)
+ param->cv = state->flags ? ZSWAP32(state->check) : state->check;
/* Inflate */
do {
strm->msg = oesc_msg(dfltcc_state->msg, param->oesc);
state->last = cc == DFLTCC_CC_OK;
state->bits = param->sbb;
- strm->adler = state->check = state->flags ? ZSWAP32(param->cv) : param->cv;
+ if (state->wrap & 4)
+ strm->adler = state->check = state->flags ? ZSWAP32(param->cv) : param->cv;
if (cc == DFLTCC_CC_OP2_CORRUPT && param->oesc != 0) {
/* Report an error if stream is corrupted */
state->mode = BAD;
--- /dev/null
+/* test_raw.cc - Test raw streams. */
+
+#include "zbuild.h"
+#ifdef ZLIB_COMPAT
+# include "zlib.h"
+#else
+# include "zlib-ng.h"
+#endif
+
+#include <gtest/gtest.h>
+
+TEST(raw, basic) {
+ PREFIX3(stream) stream;
+ int err;
+ unsigned char plain[512];
+ size_t i;
+ unsigned char compr[sizeof(plain)];
+ unsigned int compr_len;
+ unsigned char plain_again[sizeof(plain)];
+
+ memset(&stream, 0, sizeof(stream));
+ err = PREFIX(deflateInit2)(&stream, Z_BEST_SPEED, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
+ EXPECT_EQ(err, Z_OK);
+
+ for (i = 0; i < sizeof(plain); i++)
+ plain[i] = (unsigned char)i;
+ stream.adler = 0x12345678;
+ stream.next_in = plain;
+ stream.avail_in = (uint32_t)sizeof(plain);
+ stream.next_out = compr;
+ stream.avail_out = (uint32_t)sizeof(compr);
+ err = PREFIX(deflate)(&stream, Z_FINISH);
+ EXPECT_EQ(err, Z_STREAM_END);
+ EXPECT_EQ(stream.adler, 0x12345678);
+ compr_len = sizeof(compr) - stream.avail_out;
+
+ err = PREFIX(deflateEnd)(&stream);
+ EXPECT_EQ(err, Z_OK);
+
+ memset(&stream, 0, sizeof(stream));
+ err = PREFIX(inflateInit2)(&stream, -15);
+ EXPECT_EQ(err, Z_OK);
+
+ stream.adler = 0x87654321;
+ stream.next_in = compr;
+ stream.avail_in = compr_len;
+ stream.next_out = plain_again;
+ stream.avail_out = (unsigned int)sizeof(plain_again);
+
+ err = PREFIX(inflate)(&stream, Z_NO_FLUSH);
+ EXPECT_EQ(err, Z_STREAM_END);
+ EXPECT_EQ(stream.adler, 0x87654321);
+
+ err = PREFIX(inflateEnd)(&stream);
+ EXPECT_EQ(err, Z_OK);
+
+ EXPECT_TRUE(memcmp(plain_again, plain, sizeof(plain)) == 0);
+}