aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2006-06-20 06:27:13 +0000
committerNick Mathewson <nickm@torproject.org>2006-06-20 06:27:13 +0000
commita9e1a4c33c3d8ff1d26057bfcf64a14c3f1dbff5 (patch)
tree8f1924752b1467788fc19e4921e3ba9c64ae8470 /src
parented2fb517d31bf07399174757022e11d0838a824b (diff)
downloadtor-a9e1a4c33c3d8ff1d26057bfcf64a14c3f1dbff5.tar
tor-a9e1a4c33c3d8ff1d26057bfcf64a14c3f1dbff5.tar.gz
Ah. We need a new zlib_state for each networkstatus we spool out.
svn:r6667
Diffstat (limited to 'src')
-rw-r--r--src/or/dirserv.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 3ddc78cd3..72d9200cd 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1870,22 +1870,28 @@ connection_dirserv_add_dir_bytes_to_outbuf(connection_t *conn)
conn->cached_dir_offset += bytes;
if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) {
/* We just wrote the last one; finish up. */
- if (conn->dir_spool_src == DIR_SPOOL_CACHED_DIR)
- connection_dirserv_finish_spooling(conn);
+ connection_dirserv_finish_spooling(conn);
cached_dir_decref(conn->cached_dir);
conn->cached_dir = NULL;
}
return 0;
}
+/* DOCDOC */
static int
connection_dirserv_add_networkstatus_bytes_to_outbuf(connection_t *conn)
{
- int r;
+
while (buf_datalen(conn->outbuf) < DIRSERV_BUFFER_MIN) {
if (conn->cached_dir) {
- if ((r = connection_dirserv_add_dir_bytes_to_outbuf(conn)))
- return r;
+ int uncompressing = (conn->zlib_state != NULL);
+ int r = connection_dirserv_add_dir_bytes_to_outbuf(conn);
+ /* This bit is tricky. If we were uncompressing the last networkstatus,
+ * we may need to make a new zlib object to uncompress the next one. */
+ if (uncompressing && ! conn->zlib_state &&
+ conn->fingerprint_stack && smartlist_len(conn->fingerprint_stack))
+ conn->zlib_state = conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD);
+ if (r) return r;
} else if (conn->fingerprint_stack &&
smartlist_len(conn->fingerprint_stack)) {
/* Add another networkstatus; start serving it. */