diff options
author | David Goulet <dgoulet@torproject.org> | 2023-08-14 11:03:47 -0400 |
---|---|---|
committer | David Goulet <dgoulet@torproject.org> | 2023-08-14 11:05:23 -0400 |
commit | fd3f9e858045068789603656f4fbd491c2b7dcbc (patch) | |
tree | 1b143e8b287baf8a5b8aa044acac6828372d61a1 | |
parent | 78cb7616123cdddc7bcceb4d9a38367bb22217a7 (diff) | |
download | tor-fd3f9e858045068789603656f4fbd491c2b7dcbc.tar.gz tor-fd3f9e858045068789603656f4fbd491c2b7dcbc.zip |
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 <dgoulet@torproject.org>
-rw-r--r-- | changes/ticket40739 | 6 | ||||
-rw-r--r-- | src/lib/compress/compress_zstd.c | 14 |
2 files changed, 13 insertions, 7 deletions
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); |