Treat Z_BUF_ERROR as TOR_ZLIB_BUF_FULL when finalizing a zlib buffer

Otherwise, when we're out of input *and* finalizing, we might report
TOR_ZLIB_OK erroneously and not finalize the buffer.

(I don't believe this can happen in practice, with our code today:
write_to_buf_zlib ensures that we are never trying to write into a
completely empty buffer, and zlib says "Z_OK" if you give it even
one byte to write into.)

Fixes bug 11824; bugfix on 0.1.1.23 (06e09cdd47).
This commit is contained in:
Nick Mathewson 2014-06-03 20:38:00 -04:00
parent ad8977e394
commit 7573e66b99
2 changed files with 6 additions and 1 deletions

5
changes/bug11824 Normal file
View File

@ -0,0 +1,5 @@
o Minor bugfixes:
- When trying to finalize a zlib stream where we have already
exhausted all the input bytes and we need more bytes in the
output buffer, do not report the the write as successful.
Fixes bug 11824; bugfix on 0.1.1.23.

View File

@ -480,7 +480,7 @@ tor_zlib_process(tor_zlib_state_t *state,
case Z_STREAM_END: case Z_STREAM_END:
return TOR_ZLIB_DONE; return TOR_ZLIB_DONE;
case Z_BUF_ERROR: case Z_BUF_ERROR:
if (state->stream.avail_in == 0) if (state->stream.avail_in == 0 && !finish)
return TOR_ZLIB_OK; return TOR_ZLIB_OK;
return TOR_ZLIB_BUF_FULL; return TOR_ZLIB_BUF_FULL;
case Z_OK: case Z_OK: