diff options
author | Nick Mathewson <nickm@torproject.org> | 2017-06-20 11:55:18 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-06-20 12:08:12 -0400 |
commit | 5537e1fc45b683f10b3702f00e0b1280d4a5c87a (patch) | |
tree | 88aab1ad3b9a78e937477e96c2369d6f6d52acb2 /src/or/directory.c | |
parent | d8cd68caf1edb24b9daff2eb58f2b5f517b02c52 (diff) | |
download | tor-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.c | 24 |
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; } |