From 61ab5daa470bef70365ecc97f58c990fabd1eba7 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 14 Dec 2020 00:37:36 +0100 Subject: [PATCH] Better error handling for ZSTD decompressor --- src/dwarfs/block_compressor.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/dwarfs/block_compressor.cpp b/src/dwarfs/block_compressor.cpp index 6c8c62db..03131a12 100644 --- a/src/dwarfs/block_compressor.cpp +++ b/src/dwarfs/block_compressor.cpp @@ -635,13 +635,20 @@ class zstd_block_decompressor : public block_decompressor::impl { compression_type type() const override { return compression_type::ZSTD; } bool decompress_frame(size_t /*frame_size*/) override { + if (!error_.empty()) { + DWARFS_THROW(runtime_error, error_); + } + decompressed_.resize(uncompressed_size_); auto rv = ZSTD_decompress(decompressed_.data(), decompressed_.size(), data_, size_); + if (ZSTD_isError(rv)) { - DWARFS_THROW(runtime_error, - fmt::format("ZSTD: {}", ZSTD_getErrorName(rv))); + decompressed_.clear(); + error_ = fmt::format("ZSTD: {}", ZSTD_getErrorName(rv)); + DWARFS_THROW(runtime_error, error_); } + return true; } @@ -652,6 +659,7 @@ class zstd_block_decompressor : public block_decompressor::impl { const uint8_t* const data_; const size_t size_; const size_t uncompressed_size_; + std::string error_; }; #endif