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 75d2b17b48fffc432f70e86da279861a6e337283..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-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;
@@ -401,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. */
@@ -411,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);
@@ -420,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
        }
 }
 
@@ -570,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];
@@ -593,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;
                        }
@@ -605,6 +617,11 @@ static void see_deflate_token(char *buf, int32 len)
                        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
 }
 
 /**
@@ -644,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);
 }