diff options
author | Wayne Davison <wayne@opencoder.net> | 2022-08-09 11:42:14 -0700 |
---|---|---|
committer | Wayne Davison <wayne@opencoder.net> | 2022-08-09 11:42:32 -0700 |
commit | db8034f12ecda624ce9f2adf3aa47ef40a12626c (patch) | |
tree | f4eba40297d5ece17795ec6efc9191b026040ad0 | |
parent | c86763dc382fc6ed6c4c4c461243f51acfc3f226 (diff) | |
download | rsync-db8034f12ecda624ce9f2adf3aa47ef40a12626c.tar.gz |
Escape leading tilde char when "~" or with -R.
-rw-r--r-- | options.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -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])) |