When a text conflict occurs during a merge, the user is given the option to resolve the conflict and we spawn their editor for them.
In svn_cmdline__edit_file_externally, we explicitly use the shell to invoke the editor, so that $SVN_EDITOR can be a command with arguments rather than just a binary name. We rely on the user to set this up correctly. However, the literal filename is included directly in the command given to the shell. This is problematic if the filename has, among other things, whitespace in it. I took a look at using apr_pescape_shell() to do address this, but it doesn't escape whitespace. I'm not sure if this is intentional, but quoting the escaped filename does appear to work. Thoughts? [[[ Index: subversion/libsvn_subr/cmdline.c =================================================================== --- subversion/libsvn_subr/cmdline.c (revision 1871151) +++ subversion/libsvn_subr/cmdline.c (working copy) @@ -39,6 +39,7 @@ #include <apr.h> /* for STDIN_FILENO */ #include <apr_errno.h> /* for apr_strerror */ +#include <apr_escape.h> #include <apr_general.h> /* for apr_initialize/apr_terminate */ #include <apr_strings.h> /* for apr_snprintf */ #include <apr_pools.h> @@ -1330,7 +1331,9 @@ return svn_error_wrap_apr (apr_err, _("Can't change working directory to '%s'"), base_dir); - cmd = apr_psprintf(pool, "%s %s", editor, file_name); + /* editor is explicitly documented as being interpreted by the user's shell, + and as such should already be quoted/escaped as needed. */ + cmd = apr_psprintf(pool, "%s \"%s\"", editor, apr_pescape_shell(pool, file_name)); sys_err = system(cmd); apr_err = apr_filepath_set(old_cwd, pool); @@ -1489,8 +1492,11 @@ err = svn_utf_cstring_from_utf8(&tmpfile_native, tmpfile_name, pool); if (err) goto cleanup; - cmd = apr_psprintf(pool, "%s %s", editor, tmpfile_native); + /* editor is explicitly documented as being interpreted by the user's shell, + and as such should already be quoted/escaped as needed. */ + cmd = apr_psprintf(pool, "%s \"%s\"", editor, apr_pescape_shell(pool, tmpfile_native)); + /* If the caller wants us to leave the file around, return the path of the file we'll use, and make a note not to destroy it. */ if (tmpfile_left) ]]] -- James GPG Key: 4096R/91BF BF4D 6956 BD5D F7B7 2D23 DFE6 91AE 331B A3DB