From fd3f9e858045068789603656f4fbd491c2b7dcbc Mon Sep 17 00:00:00 2001 From: David Goulet Date: Mon, 14 Aug 2023 11:03:47 -0400 Subject: [PATCH] zstd: Check errors right affer compressing/decompressing Considering a compression bomb before looking for errors led to false negative log warnings. Instead, it is possible the work failed for whatever reasons which is not indicative of a compression bomb. Fixes #40739 Signed-off-by: David Goulet --- changes/ticket40739 | 6 ++++++ src/lib/compress/compress_zstd.c | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 changes/ticket40739 diff --git a/changes/ticket40739 b/changes/ticket40739 new file mode 100644 index 0000000000..d65c143c56 --- /dev/null +++ b/changes/ticket40739 @@ -0,0 +1,6 @@ + o Minor bugfixes (compression): + - Right after compression/decompression work is done, check for errors. + Before this, we would consider compression bomb before that and then + looking for errors leading to false positive on that log warning. Fixes + bug 40739; bugfix on 0.3.5.1-alpha. Patch by "cypherpunks". + diff --git a/src/lib/compress/compress_zstd.c b/src/lib/compress/compress_zstd.c index 34a2e806f6..85c2bb3bfa 100644 --- a/src/lib/compress/compress_zstd.c +++ b/src/lib/compress/compress_zstd.c @@ -368,6 +368,13 @@ tor_zstd_compress_process(tor_zstd_compress_state_t *state, &output, &input); } + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.", + state->compress ? "compression" : "decompression", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + state->input_so_far += input.pos; state->output_so_far += output.pos; @@ -383,13 +390,6 @@ tor_zstd_compress_process(tor_zstd_compress_state_t *state, return TOR_COMPRESS_ERROR; } - if (ZSTD_isError(retval)) { - log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.", - state->compress ? "compression" : "decompression", - ZSTD_getErrorName(retval)); - return TOR_COMPRESS_ERROR; - } - if (state->compress && !state->have_called_end) { retval = ZSTD_flushStream(state->u.compress_stream, &output);