X-Git-Url: https://mattmccutchen.net/rsync/rsync.git/blobdiff_plain/798cde474f15ecb653c13249f85da6cb6587893d..146c2c368c627149ddca9082aab48bff00459c4e:/exclude.c diff --git a/exclude.c b/exclude.c index 38bbd0cb..df69ad3a 100644 --- a/exclude.c +++ b/exclude.c @@ -906,12 +906,14 @@ void parse_rule(struct filter_list_struct *listp, const char *pattern, &pat_len, &new_mflags); if (!cp) break; + + pattern = cp + pat_len; + if (pat_len >= MAXPATHLEN) { - rprintf(FERROR, "discarding over-long filter: %s\n", - cp); + rprintf(FERROR, "discarding over-long filter: %.*s\n", + (int)pat_len, cp); continue; } - pattern = cp + pat_len; if (new_mflags & MATCHFLG_CLEAR_LIST) { if (verbose > 2) { @@ -931,11 +933,9 @@ void parse_rule(struct filter_list_struct *listp, const char *pattern, } len = pat_len; if (new_mflags & MATCHFLG_EXCLUDE_SELF) { - const char *name = strrchr(cp, '/'); - if (name) - len -= ++name - cp; - else - name = cp; + const char *name = cp + len; + while (name > cp && name[-1] != '/') name--; + len -= name - cp; add_rule(listp, name, len, 0, 0); new_mflags &= ~MATCHFLG_EXCLUDE_SELF; len = pat_len; @@ -1141,7 +1141,7 @@ static void send_rules(int f_out, struct filter_list_struct *flp) if (!p) { rprintf(FERROR, "filter rules are too modern for remote rsync.\n"); - exit_cleanup(RERR_SYNTAX); + exit_cleanup(RERR_PROTOCOL); } if (f_out < 0) continue;