*
* Copyright (C) 1996 Andrew Tridgell
* Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2009 Wayne Davison
+ * Copyright (C) 2003-2018 Wayne Davison
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "rsync.h"
#include "itypes.h"
-#include "zlib/zlib.h"
+#include <zlib.h>
extern int do_compression;
+extern int protocol_version;
extern int module_id;
extern int def_compress_level;
extern char *skip_compress;
if (token == -1) {
/* end of file - clean up */
write_byte(f, END_FLAG);
- } else if (token != -2) {
+ } else if (token != -2 && do_compression == 1) {
/* Add the data in the current block to the compressor's
* history and hash table. */
+#ifndef EXTERNAL_ZLIB
do {
/* Break up long sections in the same way that
* see_deflate_token() does. */
toklen -= n1;
tx_strm.next_in = (Bytef *)map_ptr(buf, offset, n1);
tx_strm.avail_in = n1;
+ if (protocol_version >= 31) /* Newer protocols avoid a data-duplicating bug */
+ offset += n1;
tx_strm.next_out = (Bytef *) obuf;
tx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE);
r = deflate(&tx_strm, Z_INSERT_ONLY);
exit_cleanup(RERR_STREAMIO);
}
} while (toklen > 0);
+#else
+ toklen++;
+ rprintf(FERROR, "Impossible error in external-zlib code (1).\n");
+ exit_cleanup(RERR_STREAMIO);
+#endif
}
}
*/
static void see_deflate_token(char *buf, int32 len)
{
+#ifndef EXTERNAL_ZLIB
int r;
int32 blklen;
unsigned char hdr[5];
} else {
rx_strm.next_in = (Bytef *)buf;
rx_strm.avail_in = blklen;
+ if (protocol_version >= 31) /* Newer protocols avoid a data-duplicating bug */
+ buf += blklen;
len -= blklen;
blklen = 0;
}
exit_cleanup(RERR_STREAMIO);
}
} while (len || rx_strm.avail_out == 0);
+#else
+ buf++; len++;
+ rprintf(FERROR, "Impossible error in external-zlib code (2).\n");
+ exit_cleanup(RERR_STREAMIO);
+#endif
}
/**
*/
void see_token(char *data, int32 toklen)
{
- if (do_compression)
+ if (do_compression == 1)
see_deflate_token(data, toklen);
}