From 66fa83f7b5eb2171042aa1f804f254c94b4ddb77 Mon Sep 17 00:00:00 2001 From: Witold Filipczyk Date: Sat, 22 Aug 2015 19:28:50 +0200 Subject: [PATCH] deflate once again. --- src/encoding/deflate.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/encoding/deflate.c b/src/encoding/deflate.c index 29401355..975c2a87 100644 --- a/src/encoding/deflate.c +++ b/src/encoding/deflate.c @@ -64,7 +64,11 @@ deflate_open(int window_size, struct stream_encoded *stream, int fd) data->after_first_read = 0; data->after_end = 0; - err = inflateInit2(&data->deflate_stream, window_size); + if (window_size > 0) { + err = inflateInit2(&data->deflate_stream, window_size); + } else { + err = inflateInit(&data->deflate_stream); + } if (err != Z_OK) { mem_free(data); return -1; @@ -197,11 +201,21 @@ deflate_decode_buffer(struct stream_encoded *st, int window_size, unsigned char buffer = new_buffer; stream->next_out = buffer + stream->total_out; stream->avail_out = MAX_STR_LEN; - +restart2: error = inflate(stream, Z_SYNC_FLUSH); if (error == Z_STREAM_END) { break; } + if (error == Z_DATA_ERROR && !enc_data->after_first_read) { + (void)inflateEnd(stream); + error = inflateInit2(stream, -MAX_WBITS); + if (error == Z_OK) { + enc_data->after_first_read = 1; + stream->next_in = data; + stream->avail_in = len; + goto restart2; + } + } } while (error == Z_OK && stream->avail_in > 0); if (error == Z_STREAM_END) {