From: Wayne Davison Date: Tue, 9 Aug 2022 18:42:14 +0000 (-0700) Subject: Escape leading tilde char when "~" or with -R. X-Git-Tag: v3.2.5~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=db8034f12ecda624ce9f2adf3aa47ef40a12626c;p=thirdparty%2Frsync.git Escape leading tilde char when "~" or with -R. --- diff --git a/options.c b/options.c index a60ff515..e7a9fcae 100644 --- a/options.c +++ b/options.c @@ -2492,12 +2492,17 @@ char *safe_arg(const char *opt, const char *arg) BOOL is_filename_arg = !opt; char *escapes = is_filename_arg ? SHELL_CHARS : WILD_CHARS SHELL_CHARS; BOOL escape_leading_dash = is_filename_arg && *arg == '-'; + BOOL escape_leading_tilde = 0; int len1 = opt && *opt ? strlen(opt) + 1 : 0; int len2 = strlen(arg); int extras = escape_leading_dash ? 2 : 0; char *ret; if (!protect_args && old_style_args < 2 && (!old_style_args || (!is_filename_arg && opt != SPLIT_ARG_WHEN_OLD))) { const char *f; + if (!old_style_args && *arg == '~' && (relative_paths || !strchr(arg, '/'))) { + extras++; + escape_leading_tilde = 1; + } for (f = arg; *f; f++) { if (strchr(escapes, *f)) extras++; @@ -2520,6 +2525,8 @@ char *safe_arg(const char *opt, const char *arg) else { const char *f = arg; char *t = ret + len1; + if (escape_leading_tilde) + *t++ = '\\'; while (*f) { if (*f == '\\') { if (!is_filename_arg || !strchr(WILD_CHARS, f[1]))