Browse Source

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.
Nick Mathewson 6 years ago
parent
commit
5537e1fc45
2 changed files with 24 additions and 6 deletions
  1. 6 0
      changes/bug22670_03
  2. 18 6
      src/or/directory.c

+ 6 - 0
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.

+ 18 - 6
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;
 }