summaryrefslogtreecommitdiff
path: root/src/or/directory.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2017-06-20 11:55:18 -0400
committerNick Mathewson <nickm@torproject.org>2017-06-20 12:08:12 -0400
commit5537e1fc45b683f10b3702f00e0b1280d4a5c87a (patch)
tree88aab1ad3b9a78e937477e96c2369d6f6d52acb2 /src/or/directory.c
parentd8cd68caf1edb24b9daff2eb58f2b5f517b02c52 (diff)
downloadtor-5537e1fc45b683f10b3702f00e0b1280d4a5c87a.tar.gz
tor-5537e1fc45b683f10b3702f00e0b1280d4a5c87a.zip
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.
Diffstat (limited to 'src/or/directory.c')
-rw-r--r--src/or/directory.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/or/directory.c b/src/or/directory.c
index b6121d80d8..ac40e54ceb 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;
}