[tor-commits] [tor/release-0.3.1] If we successfully decompress an HTTP body, return immediately.
nickm at torproject.org
nickm at torproject.org
Thu Jun 29 15:38:19 UTC 2017
commit 5537e1fc45b683f10b3702f00e0b1280d4a5c87a
Author: Nick Mathewson <nickm at torproject.org>
Date: Tue Jun 20 11:55:18 2017 -0400
If we successfully decompress an HTTP body, return immediately.
This prevents us from calling
allowed_anonymous_connection_compression_method() on the unused
guessed method (if any), and rejecting something that was already
safe to use.
---
changes/bug22670_03 | 6 ++++++
src/or/directory.c | 24 ++++++++++++++++++------
2 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/changes/bug22670_03 b/changes/bug22670_03
new file mode 100644
index 0000000..8a7aa49
--- /dev/null
+++ b/changes/bug22670_03
@@ -0,0 +1,6 @@
+ o Minor bugfixes (compression):
+ - When decompressing an object received over an anonymous directory
+ connection, if we have already successfully decompressed it using an
+ acceptable compression method, do not reject it for looking like an
+ unacceptable compression method. Fixes part of bug 22670; bugfix on
+ 0.3.1.1-alpha.
diff --git a/src/or/directory.c b/src/or/directory.c
index b6121d8..ac40e54 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -2255,9 +2255,15 @@ dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
goto done;
}
- if (tor_compress_supports_method(compression))
+ if (tor_compress_supports_method(compression)) {
tor_uncompress(&new_body, &new_len, body, body_len, compression,
!allow_partial, LOG_PROTOCOL_WARN);
+ if (new_body) {
+ /* We succeeded with the declared compression method. Great! */
+ rv = 0;
+ goto done;
+ }
+ }
/* Okay, if that didn't work, and we think that it was compressed
* differently, try that. */
@@ -2268,7 +2274,7 @@ dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
goto done;
}
- if (!new_body && tor_compress_supports_method(guessed) &&
+ if (tor_compress_supports_method(guessed) &&
compression != guessed) {
tor_uncompress(&new_body, &new_len, body, body_len, guessed,
!allow_partial, LOG_INFO);
@@ -2286,13 +2292,19 @@ dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
rv = -1;
goto done;
}
+
+ done:
if (new_body) {
- tor_free(*bodyp);
- *bodyp = new_body;
- *bodylenp = new_len;
+ if (rv == 0) {
+ /* success! */
+ tor_free(*bodyp);
+ *bodyp = new_body;
+ *bodylenp = new_len;
+ } else {
+ tor_free(new_body);
+ }
}
- done:
return rv;
}
More information about the tor-commits
mailing list