aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2023-08-14 11:03:47 -0400
committerDavid Goulet <dgoulet@torproject.org>2023-08-14 11:05:23 -0400
commitfd3f9e858045068789603656f4fbd491c2b7dcbc (patch)
tree1b143e8b287baf8a5b8aa044acac6828372d61a1
parent78cb7616123cdddc7bcceb4d9a38367bb22217a7 (diff)
downloadtor-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/ticket407396
-rw-r--r--src/lib/compress/compress_zstd.c14
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);