Ver código fonte

Merge remote-tracking branch 'public/bug11648'

Nick Mathewson 10 anos atrás
pai
commit
5b861ae53f
2 arquivos alterados com 18 adições e 4 exclusões
  1. 8 0
      changes/bug11648
  2. 10 4
      src/or/dirserv.c

+ 8 - 0
changes/bug11648

@@ -0,0 +1,8 @@
+  o Minor bugfixes (Directory server):
+    - When sending a compressed set of descriptors or microdescriptors,
+      make sure to finalize the zlib stream. Previously, we would write
+      all the compressed data, but if the last descriptor we wanted to
+      send was missing or too old, we would not mark the stream as
+      finished. This caused problems for decompression tools. Fixes bug
+      11648; bugfix on 0.1.1.23.
+

+ 10 - 4
src/or/dirserv.c

@@ -3296,8 +3296,6 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
     }
     body = signed_descriptor_get_body(sd);
     if (conn->zlib_state) {
-      /* XXXX024 This 'last' business should actually happen on the last
-       * routerinfo, not on the last fingerprint. */
       int last = ! smartlist_len(conn->fingerprint_stack);
       connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn,
                                    last);
@@ -3314,6 +3312,11 @@ connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn)
 
   if (!smartlist_len(conn->fingerprint_stack)) {
     /* We just wrote the last one; finish up. */
+    if (conn->zlib_state) {
+      connection_write_to_buf_zlib("", 0, conn, 1);
+      tor_zlib_free(conn->zlib_state);
+      conn->zlib_state = NULL;
+    }
     conn->dir_spool_src = DIR_SPOOL_NONE;
     smartlist_free(conn->fingerprint_stack);
     conn->fingerprint_stack = NULL;
@@ -3339,8 +3342,6 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
     if (!md || !md->body)
       continue;
     if (conn->zlib_state) {
-      /* XXXX024 This 'last' business should actually happen on the last
-       * routerinfo, not on the last fingerprint. */
       int last = !smartlist_len(conn->fingerprint_stack);
       connection_write_to_buf_zlib(md->body, md->bodylen, conn, last);
       if (last) {
@@ -3352,6 +3353,11 @@ connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn)
     }
   }
   if (!smartlist_len(conn->fingerprint_stack)) {
+    if (conn->zlib_state) {
+      connection_write_to_buf_zlib("", 0, conn, 1);
+      tor_zlib_free(conn->zlib_state);
+      conn->zlib_state = NULL;
+    }
     conn->dir_spool_src = DIR_SPOOL_NONE;
     smartlist_free(conn->fingerprint_stack);
     conn->fingerprint_stack = NULL;