summaryrefslogtreecommitdiff
path: root/options.c
diff options
context:
space:
mode:
authorWayne Davison <wayne@opencoder.net>2022-08-09 11:42:14 -0700
committerWayne Davison <wayne@opencoder.net>2022-08-09 11:42:32 -0700
commitdb8034f12ecda624ce9f2adf3aa47ef40a12626c (patch)
treef4eba40297d5ece17795ec6efc9191b026040ad0 /options.c
parentc86763dc382fc6ed6c4c4c461243f51acfc3f226 (diff)
downloadrsync-db8034f12ecda624ce9f2adf3aa47ef40a12626c.tar.gz
Escape leading tilde char when "~" or with -R.
Diffstat (limited to 'options.c')
-rw-r--r--options.c7
1 files changed, 7 insertions, 0 deletions
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]))