diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-03-02 12:14:48 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-03-02 12:29:42 +0000 |
commit | 63703eefad8453b13286a614bd82792c7f87fd1a (patch) | |
tree | 6e8b417ee2c0c26f3d82731d6c240cf50b486715 /vespalib | |
parent | f38e0a348c4b0ed6ce769dd558a6e1c592d2d39a (diff) |
only signal eof when both decompress input and output are empty
Diffstat (limited to 'vespalib')
-rw-r--r-- | vespalib/src/vespa/vespalib/data/lz4_input_decoder.cpp | 49 |
1 files changed, 23 insertions, 26 deletions
diff --git a/vespalib/src/vespa/vespalib/data/lz4_input_decoder.cpp b/vespalib/src/vespa/vespalib/data/lz4_input_decoder.cpp index c7f0fce664f..39407449105 100644 --- a/vespalib/src/vespa/vespalib/data/lz4_input_decoder.cpp +++ b/vespalib/src/vespa/vespalib/data/lz4_input_decoder.cpp @@ -19,30 +19,27 @@ Lz4InputDecoder::decode_more() { assert((_pos == _used) && !_eof); Memory memory = _input.obtain(); - if (memory.size == 0) { - auto res = LZ4F_freeDecompressionContext(_ctx); - _ctx = nullptr; - _eof = true; - if (LZ4F_isError(res)) { - fail(LZ4F_getErrorName(res)); - } + size_t input_size = memory.size; + size_t output_size = _buffer.size(); + auto decode_res = LZ4F_decompress(_ctx, + &_buffer[0], &output_size, + memory.data, &input_size, + nullptr); + if (LZ4F_isError(decode_res)) { + fail(LZ4F_getErrorName(decode_res)); } else { - size_t input_size = memory.size; - size_t output_size = _buffer.size(); - auto res = LZ4F_decompress(_ctx, - &_buffer[0], &output_size, - memory.data, &input_size, - nullptr); - if (LZ4F_isError(res)) { - fail(LZ4F_getErrorName(res)); - } else if (input_size == 0) { - fail("lz4 refusing to eat input"); - } else { - assert(input_size <= memory.size); - assert(output_size <= _buffer.size()); - _input.evict(input_size); - _used = output_size; - _pos = 0; + assert(input_size <= memory.size); + assert(output_size <= _buffer.size()); + _input.evict(input_size); + _used = output_size; + _pos = 0; + if ((input_size == 0) && (output_size == 0)) { + auto fini_res = LZ4F_freeDecompressionContext(_ctx); + _ctx = nullptr; + _eof = true; + if (LZ4F_isError(fini_res)) { + fail(LZ4F_getErrorName(fini_res)); + } } } } @@ -57,9 +54,9 @@ Lz4InputDecoder::Lz4InputDecoder(Input &input, size_t buffer_size) _reason(), _ctx(nullptr) { - auto res = LZ4F_createDecompressionContext(&_ctx, LZ4F_VERSION); - if (LZ4F_isError(res)) { - fail(LZ4F_getErrorName(res)); + auto init_res = LZ4F_createDecompressionContext(&_ctx, LZ4F_VERSION); + if (LZ4F_isError(init_res)) { + fail(LZ4F_getErrorName(init_res)); } } |