diff options
author | Nick Mathewson <nickm@torproject.org> | 2006-06-20 06:27:13 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2006-06-20 06:27:13 +0000 |
commit | a9e1a4c33c3d8ff1d26057bfcf64a14c3f1dbff5 (patch) | |
tree | 8f1924752b1467788fc19e4921e3ba9c64ae8470 /src | |
parent | ed2fb517d31bf07399174757022e11d0838a824b (diff) | |
download | tor-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.c | 16 |
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. */ |