aboutsummaryrefslogtreecommitdiffstats
path: root/token.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2005-02-14 08:28:00 +0000
committerWayne Davison <wayned@samba.org>2005-02-14 08:28:00 +0000
commit01f439ec6eb14526ef8cffe7cb08177c394fe8f5 (patch)
tree03a4da99df111e9649a9e7aab690f7b430c4d9b4 /token.c
parentacc461c7dad0760936f5da49f8b22860d127bb83 (diff)
downloadandroid_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.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/token.c b/token.c
index 2c660c76..67acbd98 100644
--- a/token.c
+++ b/token.c
@@ -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);
}
}