Fix --remove-source-files sanity check w/--copy-links the right way.
[rsync.git] / token.c
diff --git a/token.c b/token.c
index 08c1190dd4bee70f3df60a862db94629ea7ae509..f1299ee3d0229b23a35ea6b8e53cb48d0e6b03ec 100644 (file)
--- a/token.c
+++ b/token.c
@@ -3,7 +3,7 @@
  *
  * 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;
@@ -45,12 +46,12 @@ static void add_suffix(struct suffix_tree **prior, char ltr, const char *str)
 
        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) {
@@ -100,7 +101,6 @@ static void add_nocompress_suffixes(const char *str)
                } while (*++f != '/' && *f);
                *t++ = '\0';
 
-               fprintf(stderr, "adding `%s'\n", buf);
                add_suffix(&suftree, *buf, buf+1);
        }
 
@@ -193,6 +193,8 @@ void set_compression(const char *fname)
                return;
 
        while (1) {
+               if (isUpper(&ltr))
+                       ltr = toLower(&ltr);
                while (node->letter != ltr) {
                        if (node->letter > ltr)
                                return;
@@ -307,7 +309,7 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
                                         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");
@@ -400,9 +402,10 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
        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. */
@@ -410,6 +413,8 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
                        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);
@@ -419,6 +424,11 @@ send_deflated_token(int f, int32 token, struct map_struct *buf, OFF_T offset,
                                exit_cleanup(RERR_STREAMIO);
                        }
                } while (toklen > 0);
+#else
+               toklen++;
+               rprintf(FERROR, "Impossible error in external-zlib code (1).\n");
+               exit_cleanup(RERR_STREAMIO);
+#endif
        }
 }
 
@@ -451,7 +461,7 @@ static int32 recv_deflated_token(int f, char **data)
                                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))))
@@ -569,6 +579,7 @@ static int32 recv_deflated_token(int f, char **data)
  */
 static void see_deflate_token(char *buf, int32 len)
 {
+#ifndef EXTERNAL_ZLIB
        int r;
        int32 blklen;
        unsigned char hdr[5];
@@ -592,6 +603,8 @@ static void see_deflate_token(char *buf, int32 len)
                        } 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;
                        }
@@ -599,11 +612,16 @@ static void see_deflate_token(char *buf, int32 len)
                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
 }
 
 /**
@@ -643,6 +661,6 @@ int32 recv_token(int f, char **data)
  */
 void see_token(char *data, int32 toklen)
 {
-       if (do_compression)
+       if (do_compression == 1)
                see_deflate_token(data, toklen);
 }