diff options
| author | Wayne Davison <wayned@samba.org> | 2005-02-14 08:28:00 +0000 |
|---|---|---|
| committer | Wayne Davison <wayned@samba.org> | 2005-02-14 08:28:00 +0000 |
| commit | 01f439ec6eb14526ef8cffe7cb08177c394fe8f5 (patch) | |
| tree | 03a4da99df111e9649a9e7aab690f7b430c4d9b4 /token.c | |
| parent | acc461c7dad0760936f5da49f8b22860d127bb83 (diff) | |
| download | android_external_rsync-01f439ec6eb14526ef8cffe7cb08177c394fe8f5.tar.gz android_external_rsync-01f439ec6eb14526ef8cffe7cb08177c394fe8f5.tar.bz2 android_external_rsync-01f439ec6eb14526ef8cffe7cb08177c394fe8f5.zip | |
Fixed a mismatch in the compressed-data handling between how the
sending side and the receiving side handled implicit (unsent) data.
Diffstat (limited to 'token.c')
| -rw-r--r-- | token.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -262,16 +262,22 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset, } else if (token != -2) { /* Add the data in the current block to the compressor's * history and hash table. */ - tx_strm.next_in = (Bytef *) map_ptr(buf, offset, toklen); - tx_strm.avail_in = toklen; - tx_strm.next_out = (Bytef *) obuf; - tx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE); - r = deflate(&tx_strm, Z_INSERT_ONLY); - if (r != Z_OK || tx_strm.avail_in != 0) { - rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n", - r, tx_strm.avail_in); - exit_cleanup(RERR_STREAMIO); - } + do { + /* Break up long sections in the same way that + * see_deflate_token() does. */ + int32 n1 = toklen > 0xffff ? 0xffff : toklen; + toklen -= n1; + tx_strm.next_in = (Bytef *)map_ptr(buf, offset, n1); + tx_strm.avail_in = n1; + tx_strm.next_out = (Bytef *) obuf; + tx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE); + r = deflate(&tx_strm, Z_INSERT_ONLY); + if (r != Z_OK || tx_strm.avail_in != 0) { + rprintf(FERROR, "deflate on token returned %d (%d bytes left)\n", + r, tx_strm.avail_in); + exit_cleanup(RERR_STREAMIO); + } + } while (toklen > 0); } } |
