X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/151f59f155c1a2f3f6301c0ad5b59654d922e34a..0417c34e2d641cbac292ba5cf8a619249c87d4e3:/flist.c diff --git a/flist.c b/flist.c index 30e88ab4..1f11193f 100644 --- a/flist.c +++ b/flist.c @@ -480,19 +480,16 @@ void send_file_entry(struct file_struct *file, int f, unsigned short base_flags) } #endif - if (always_checksum) { + if (always_checksum && (S_ISREG(mode) || protocol_version < 28)) { char *sum; + int slen = protocol_version < 21 ? 2 : MD4_SUM_LENGTH; if (S_ISREG(mode)) sum = file->u.sum; - else if (protocol_version < 28) { + else { /* Prior to 28, we sent a useless set of nulls. */ sum = empty_sum; - } else - sum = NULL; - if (sum) { - write_buf(f, sum, - protocol_version < 21 ? 2 : MD4_SUM_LENGTH); } + write_buf(f, sum, slen); } strlcpy(lastname, fname, MAXPATHLEN); @@ -708,20 +705,17 @@ static struct file_struct *receive_file_entry(struct file_list *flist, } #endif - if (always_checksum) { + if (always_checksum && (sum_len || protocol_version < 28)) { char *sum; + int slen = protocol_version < 21 ? 2 : MD4_SUM_LENGTH; if (sum_len) { file->u.sum = sum = bp; /*bp += sum_len;*/ - } else if (protocol_version < 28) { + } else { /* Prior to 28, we get a useless set of nulls. */ sum = empty_sum; - } else - sum = NULL; - if (sum) { - read_buf(f, sum, - protocol_version < 21 ? 2 : MD4_SUM_LENGTH); } + read_buf(f, sum, slen); } if (!preserve_perms) { @@ -1166,7 +1160,41 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) dir = fname; fname = p + 1; } - } else if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) { + } else if ((p = strstr(fname, "/./")) != NULL) { + *p = '\0'; + if (p == fname) + dir = "/"; + else + dir = fname; + fname = p + 3; + } + + if (!*fname) + fname = "."; + + if (dir && *dir) { + static char *lastdir; + static int lastdir_len; + + strlcpy(olddir, curr_dir, sizeof olddir); + + if (!push_dir(dir)) { + io_error |= IOERR_GENERAL; + rsyserr(FERROR, errno, "push_dir %s failed", + full_fname(dir)); + continue; + } + + if (lastdir && strcmp(lastdir, dir) == 0) { + flist_dir = lastdir; + flist_dir_len = lastdir_len; + } else { + flist_dir = lastdir = strdup(dir); + flist_dir_len = lastdir_len = strlen(dir); + } + } + + if (implied_dirs && (p=strrchr(fname,'/')) && p != fname) { /* Send the implied directories at the start of the * source spec, so we get their permissions right. */ char *lp = lastpath, *fn = fname, *slash = fname; @@ -1197,31 +1225,6 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) } } - if (!*fname) - fname = "."; - - if (dir && *dir) { - static char *lastdir; - static int lastdir_len; - - strcpy(olddir, curr_dir); /* can't overflow */ - - if (!push_dir(dir)) { - io_error |= IOERR_GENERAL; - rsyserr(FERROR, errno, "push_dir %s failed", - full_fname(dir)); - continue; - } - - if (lastdir && strcmp(lastdir, dir) == 0) { - flist_dir = lastdir; - flist_dir_len = lastdir_len; - } else { - flist_dir = lastdir = strdup(dir); - flist_dir_len = lastdir_len = strlen(dir); - } - } - if (one_file_system) filesystem_dev = st.st_dev; @@ -1235,7 +1238,7 @@ struct file_list *send_file_list(int f, int argc, char *argv[]) flist_dir_len = 0; if (!pop_dir(olddir)) { rsyserr(FERROR, errno, "pop_dir %s failed", - full_fname(dir)); + full_fname(olddir)); exit_cleanup(RERR_FILESELECT); } }