From 1d127053e937e0cda71e43b9ce5c58946e68ad8f Mon Sep 17 00:00:00 2001 From: Phil Hord Date: Mon, 19 Oct 2020 20:25:16 -0700 Subject: [PATCH] Don't try to read concatenated gzip streams Don't try to continue reading the next stream of a concatenated gzip file. The next stream may be CRC noise or other garbage. Maybe in the future we should look for a gzip header in the following bytes of the stream and try to decode from there. But it's not clear that anyone ever uses this supposed gzip feature anyway. Let's just end the stream when we reach EOS. Also, if the stream fails to init, let's leave it closed instead of throwing an error no one is likely to catch. Log the error msg from zlib if one is provided. --- src/line_buffer.cc | 27 ++++----------------------- src/line_buffer.hh | 1 - 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/src/line_buffer.cc b/src/line_buffer.cc index 6a0241cf..f217bd75 100644 --- a/src/line_buffer.cc +++ b/src/line_buffer.cc @@ -152,27 +152,9 @@ void line_buffer::gz_indexed::init_stream() this->strm.avail_out = 0; int rc = inflateInit2(&strm, GZ_HEADER_MODE); if (rc != Z_OK) { - throw(rc); // FIXME: exception wrapper + log_error(" inflateInit2: %d %s", (int)rc, this->strm.msg ? this->strm.msg : ""); } } - -void line_buffer::gz_indexed::continue_stream() -{ - // Save our position and output buffer - auto total_in = this->strm.total_in; - auto total_out = this->strm.total_out; - auto avail_out = this->strm.avail_out; - auto next_out = this->strm.next_out; - - init_stream(); - - // Restore position and output buffer - this->strm.total_in = total_in; - this->strm.total_out = total_out; - this->strm.avail_out = avail_out; - this->strm.next_out = next_out; -} - void line_buffer::gz_indexed::open(int fd) { this->close(); @@ -204,11 +186,10 @@ int line_buffer::gz_indexed::stream_data(void * buf, size_t size) ? Z_SYNC_FLUSH : Z_BLOCK; auto err = inflate(&this->strm, flush); if (err == Z_STREAM_END) { - // Reached end of stream; re-init for a possible subsequent stream - continue_stream(); + break; } else if (err != Z_OK) { - log_error(" inflate-error: %d", (int)err); - throw error(err); // FIXME: exception wrapper + log_error(" inflate-error: %d %s", (int)err, this->strm.msg ? this->strm.msg : ""); + return 0; } if (this->strm.total_in >= last + SYNCPOINT_SIZE && diff --git a/src/line_buffer.hh b/src/line_buffer.hh index 8a5101d6..e7c9bccb 100644 --- a/src/line_buffer.hh +++ b/src/line_buffer.hh @@ -104,7 +104,6 @@ public: void close(); void init_stream(); - void continue_stream(); void open(int fd); int stream_data(void * buf, size_t size); void seek(off_t offset);