One more improvement to the 0-flag-byte avoidance algorithm.
[rsync/rsync.git] / flist.c
diff --git a/flist.c b/flist.c
index d6e1cf1..c9ec080 100644 (file)
--- a/flist.c
+++ b/flist.c
@@ -441,19 +441,23 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
        if (l2 > 255)
                flags |= XMIT_LONG_NAME;
 
-       /* We must make sure we don't send a zero flags byte or
-        * the other end will terminate the flist transfer. */
-       if (flags == 0 && !S_ISDIR(mode))
-               flags |= XMIT_TOP_DIR; /* NOTE: no meaning for non-dir */
+       /* We must make sure we don't send a zero flag byte or the
+        * other end will terminate the flist transfer.  Note that
+        * the use of XMIT_TOP_DIR on a non-dir has no meaning, so
+        * it's harmless way to add a bit to the first flag byte. */
        if (protocol_version >= 28) {
-               if ((flags & 0xFF00) || flags == 0) {
+               if (!flags && !S_ISDIR(mode))
+                       flags |= XMIT_TOP_DIR;
+               if ((flags & 0xFF00) || !flags) {
                        flags |= XMIT_EXTENDED_FLAGS;
                        write_byte(f, flags);
                        write_byte(f, flags >> 8);
                } else
                        write_byte(f, flags);
        } else {
-               if (flags == 0)
+               if (!(flags & 0xFF) && !S_ISDIR(mode))
+                       flags |= XMIT_TOP_DIR;
+               if (!(flags & 0xFF))
                        flags |= XMIT_LONG_NAME;
                write_byte(f, flags);
        }
@@ -490,8 +494,9 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags)
 
 #if SUPPORT_LINKS
        if (preserve_links && S_ISLNK(mode)) {
-               write_int(f, strlen(file->u.link));
-               write_buf(f, file->u.link, strlen(file->u.link));
+               int len = strlen(file->u.link);
+               write_int(f, len);
+               write_buf(f, file->u.link, len);
        }
 #endif
 
@@ -643,14 +648,14 @@ void receive_file_entry(struct file_struct **fptr, unsigned short flags, int f)
        }
 
        if (preserve_links && S_ISLNK(mode)) {
-               int l = read_int(f);
-               if (l < 0) {
-                       rprintf(FERROR, "overflow: l=%d\n", l);
+               int len = read_int(f);
+               if (len < 0 || len >= MAXPATHLEN) {
+                       rprintf(FERROR, "overflow: len=%d\n", len);
                        overflow("receive_file_entry");
                }
-               if (!(file->u.link = new_array(char, l + 1)))
+               if (!(file->u.link = new_array(char, len + 1)))
                        out_of_memory("receive_file_entry 2");
-               read_sbuf(f, file->u.link, l);
+               read_sbuf(f, file->u.link, len);
                if (sanitize_paths)
                        sanitize_path(file->u.link, file->dirname);
        }