*
* Copyright (C) 1996 Andrew Tridgell
* Copyright (C) 1996 Paul Mackerras
- * Copyright (C) 2003-2008 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 (ltr == '[') {
const char *after = strchr(str, ']');
- /* Just skip bogus character classes. */
- if (!after++)
+ /* Treat "[foo" and "[]" as having a literal '['. */
+ if (after && after++ != str+1) {
+ while ((ltr = *str++) != ']')
+ add_suffix(prior, ltr, after);
return;
- while ((ltr = *str++) != ']')
- add_suffix(prior, ltr, after);
- return;
+ }
}
for (node = *prior; node; prior = &node->sibling, node = node->sibling) {
} while (*++f != '/' && *f);
*t++ = '\0';
- fprintf(stderr, "adding `%s'\n", buf);
add_suffix(&suftree, *buf, buf+1);
}
return;
while (1) {
+ if (isUpper(<r))
+ ltr = toLower(<r);
while (node->letter != ltr) {
if (node->letter > ltr)
return;
Z_DEFLATED, -15, 8,
Z_DEFAULT_STRATEGY) != Z_OK) {
rprintf(FERROR, "compression init failed\n");
- exit_cleanup(RERR_STREAMIO);
+ exit_cleanup(RERR_PROTOCOL);
}
if ((obuf = new_array(char, OBUF_SIZE)) == NULL)
out_of_memory("send_deflated_token");
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
}
}
rx_strm.zfree = NULL;
if (inflateInit2(&rx_strm, -15) != Z_OK) {
rprintf(FERROR, "inflate init failed\n");
- exit_cleanup(RERR_STREAMIO);
+ exit_cleanup(RERR_PROTOCOL);
}
if (!(cbuf = new_array(char, MAX_DATA_COUNT))
|| !(dbuf = new_array(char, AVAIL_OUT_SIZE(CHUNK_SIZE))))
*/
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;
}
rx_strm.next_out = (Bytef *)dbuf;
rx_strm.avail_out = AVAIL_OUT_SIZE(CHUNK_SIZE);
r = inflate(&rx_strm, Z_SYNC_FLUSH);
- if (r != Z_OK) {
+ if (r != Z_OK && r != Z_BUF_ERROR) {
rprintf(FERROR, "inflate (token) returned %d\n", r);
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);
}