diff --git a/backport-Fix-bug-with-validing-remote-filter-rules.patch b/backport-Fix-bug-with-validing-remote-filter-rules.patch new file mode 100644 index 0000000000000000000000000000000000000000..bdff41604f8460f42333ca57de293c3556b09f3c --- /dev/null +++ b/backport-Fix-bug-with-validing-remote-filter-rules.patch @@ -0,0 +1,131 @@ +From 950730313de994d191ba2d5be575e97690b355e8 Mon Sep 17 00:00:00 2001 +From: Wayne Davison +Date: Mon, 12 Sep 2022 22:02:00 -0700 +Subject: [PATCH] Fix bug with validing remote filter rules. + +--- + exclude.c | 35 +++++++++++++++++++++-------------- + flist.c | 2 +- + rsync.h | 1 + + 3 files changed, 23 insertions(+), 15 deletions(-) + +diff --git a/exclude.c b/exclude.c +index 5458455b..4022e824 100644 +--- a/exclude.c ++++ b/exclude.c +@@ -78,6 +78,10 @@ static filter_rule **mergelist_parents; + static int mergelist_cnt = 0; + static int mergelist_size = 0; + ++#define LOCAL_RULE 1 ++#define REMOTE_RULE 2 ++static uchar cur_elide_value = REMOTE_RULE; ++ + /* Each filter_list_struct describes a singly-linked list by keeping track + * of both the head and tail pointers. The list is slightly unusual in that + * a parent-dir's content can be appended to the end of the local list in a +@@ -220,6 +224,7 @@ static void add_rule(filter_rule_list *listp, const char *pat, unsigned int pat_ + slash_cnt++; + } + } ++ rule->elide = 0; + strlcpy(rule->pattern + pre_len, pat, pat_len + 1); + pat_len += pre_len; + if (suf_len) { +@@ -900,7 +905,7 @@ static int rule_matches(const char *fname, filter_rule *ex, int name_flags) + const char *strings[16]; /* more than enough */ + const char *name = fname + (*fname == '/'); + +- if (!*name) ++ if (!*name || ex->elide == cur_elide_value) + return 0; + + if (!(name_flags & NAME_IS_XATTR) ^ !(ex->rflags & FILTRULE_XATTR)) +@@ -1016,6 +1021,15 @@ int name_is_excluded(const char *fname, int name_flags, int filter_level) + return 0; + } + ++int check_server_filter(filter_rule_list *listp, enum logcode code, const char *name, int name_flags) ++{ ++ int ret; ++ cur_elide_value = LOCAL_RULE; ++ ret = check_filter(listp, code, name, name_flags); ++ cur_elide_value = REMOTE_RULE; ++ return ret; ++} ++ + /* Return -1 if file "name" is defined to be excluded by the specified + * exclude list, 1 if it is included, and 0 if it was not matched. */ + int check_filter(filter_rule_list *listp, enum logcode code, +@@ -1571,7 +1585,7 @@ char *get_rule_prefix(filter_rule *rule, const char *pat, int for_xfer, + + static void send_rules(int f_out, filter_rule_list *flp) + { +- filter_rule *ent, *prev = NULL; ++ filter_rule *ent; + + for (ent = flp->head; ent; ent = ent->next) { + unsigned int len, plen, dlen; +@@ -1586,21 +1600,15 @@ static void send_rules(int f_out, filter_rule_list *flp) + * merge files as an optimization (since they can only have + * include/exclude rules). */ + if (ent->rflags & FILTRULE_SENDER_SIDE) +- elide = am_sender ? 1 : -1; ++ elide = am_sender ? LOCAL_RULE : REMOTE_RULE; + if (ent->rflags & FILTRULE_RECEIVER_SIDE) +- elide = elide ? 0 : am_sender ? -1 : 1; ++ elide = elide ? 0 : am_sender ? REMOTE_RULE : LOCAL_RULE; + else if (delete_excluded && !elide + && (!(ent->rflags & FILTRULE_PERDIR_MERGE) + || ent->rflags & FILTRULE_NO_PREFIXES)) +- elide = am_sender ? 1 : -1; +- if (elide < 0) { +- if (prev) +- prev->next = ent->next; +- else +- flp->head = ent->next; +- } else +- prev = ent; +- if (elide > 0) ++ elide = am_sender ? LOCAL_RULE : REMOTE_RULE; ++ ent->elide = elide; ++ if (elide == LOCAL_RULE) + continue; + if (ent->rflags & FILTRULE_CVS_IGNORE + && !(ent->rflags & FILTRULE_MERGE_FILE)) { +@@ -1628,7 +1636,6 @@ static void send_rules(int f_out, filter_rule_list *flp) + if (dlen) + write_byte(f_out, '/'); + } +- flp->tail = prev; + } + + /* This is only called by the client. */ +diff --git a/flist.c b/flist.c +index 0313db54..db11b353 100644 +--- a/flist.c ++++ b/flist.c +@@ -991,7 +991,7 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x + if (*thisname != '.' || thisname[1] != '\0') { + int filt_flags = S_ISDIR(mode) ? NAME_IS_DIR : NAME_IS_FILE; + if (!trust_sender_filter /* a per-dir filter rule means we must trust the sender's filtering */ +- && filter_list.head && check_filter(&filter_list, FINFO, thisname, filt_flags) < 0) { ++ && filter_list.head && check_server_filter(&filter_list, FINFO, thisname, filt_flags) < 0) { + rprintf(FERROR, "ERROR: rejecting excluded file-list name: %s\n", thisname); + exit_cleanup(RERR_PROTOCOL); + } +diff --git a/rsync.h b/rsync.h +index f0d3dd0b..0a5ff809 100644 +--- a/rsync.h ++++ b/rsync.h +@@ -1024,6 +1024,7 @@ typedef struct filter_struct { + int slash_cnt; + struct filter_list_struct *mergelist; + } u; ++ uchar elide; + } filter_rule; + + typedef struct filter_list_struct { +-- +2.18.2 + diff --git a/backport-Fix-exclusion-of-root-directory-with-relative.patch b/backport-Fix-exclusion-of-root-directory-with-relative.patch new file mode 100644 index 0000000000000000000000000000000000000000..efb4ba93b1e02509b1da35d27aeb065607ad025d --- /dev/null +++ b/backport-Fix-exclusion-of-root-directory-with-relative.patch @@ -0,0 +1,25 @@ +From 71c2b5d0e386b845fb2f4d427568451f098008ff Mon Sep 17 00:00:00 2001 +From: Wayne Davison +Date: Wed, 14 Sep 2022 07:14:13 -0700 +Subject: [PATCH] Fix exclusion of /. with --relative. + +--- + flist.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/flist.c b/flist.c +index 0b259cca..82d686a6 100644 +--- a/flist.c ++++ b/flist.c +@@ -988,7 +988,7 @@ static struct file_struct *recv_file_entry(int f, struct file_list *flist, int x + exit_cleanup(RERR_UNSUPPORTED); + } + +- if (*thisname != '.' || thisname[1] != '\0') { ++ if (*thisname == '/' ? thisname[1] != '.' || thisname[2] != '\0' : *thisname != '.' || thisname[1] != '\0') { + int filt_flags = S_ISDIR(mode) ? NAME_IS_DIR : NAME_IS_FILE; + if (!trust_sender_filter /* a per-dir filter rule means we must trust the sender's filtering */ + && filter_list.head && check_server_filter(&filter_list, FINFO, thisname, filt_flags) < 0) { +-- +2.18.2 + diff --git a/rsync.spec b/rsync.spec index 2c13aa1640616492a60bec7d9541c6d42a0bc8d4..ba051f01a0c554821b482bade00b75bfae5de601 100644 --- a/rsync.spec +++ b/rsync.spec @@ -1,6 +1,6 @@ Name: rsync Version: 3.1.3 -Release: 9 +Release: 10 Summary: Fast incremental file transfer utility License: GPLv3+ URL: http://rsync.samba.org/ @@ -36,6 +36,8 @@ Patch15: backport-CVE-2022-37434.patch Patch16: backport-A-fix-for-the-zlib-fix.patch Patch17: backport-rsync-noatime-2.patch Patch18: backport-CVE-2022-29154.patch +Patch19: backport-Fix-bug-with-validing-remote-filter-rules.patch +Patch20: backport-Fix-exclusion-of-root-directory-with-relative.patch %description Rsync is an open source utility that provides fast incremental file transfer. @@ -96,6 +98,10 @@ install -D -m644 %{SOURCE6} %{buildroot}/%{_unitdir}/rsyncd@.service %{_mandir}/man5/rsyncd.conf.5* %changelog +* Mon May 13 2024 lixiaoyong - 3.1.3-10 +- Type:bugfix +- DESC:Add Patch19 and Patch20 to fix exclusion of /. with --relative + * Fri Aug 26 2022 panxiaohe - 3.1.3-9 - enable make check - delete redundant patch and renew rsync-noatime.patch