Change the way we pass the --suffix option to the remote process so
[rsync/rsync.git] / options.c
index 945dddd..2dd0da4 100644 (file)
--- a/options.c
+++ b/options.c
@@ -633,6 +633,11 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
        if (!backup_suffix)
                backup_suffix = backup_dir? "" : BACKUP_SUFFIX;
        backup_suffix_len = strlen(backup_suffix);
+       if (strchr(backup_suffix, '/') != NULL) {
+               rprintf(FERROR, "--suffix cannot contain slashes: %s\n",
+                       backup_suffix);
+               exit_cleanup(RERR_SYNTAX);
+       }
        if (backup_dir)
                backup_dir_len = strlen(backup_dir);
        else if (!backup_suffix_len) {
@@ -821,8 +826,12 @@ void server_options(char **args,int *argc)
 
        /* Only send --suffix if it specifies a non-default value. */
        if (strcmp(backup_suffix, backup_dir? "" : BACKUP_SUFFIX) != 0) {
-               args[ac++] = "--suffix";
-               args[ac++] = backup_suffix;
+               char *s = malloc(9+backup_suffix_len+1);
+               if (!s)
+                       out_of_memory("server_options");
+               /* We use the following syntax to avoid weirdness with '~'. */
+               sprintf(s, "--suffix=%s", backup_suffix);
+               args[ac++] = s;
        }
 
        if (delete_mode && !delete_excluded)