On Sat, Feb 15, 2020 at 05:26:25PM +0000, Daniel Shahaf wrote:
> james...@apache.org wrote on Sat, 15 Feb 2020 16:24 -0000:
> > Escape filenames when invoking $SVN_EDITOR
> > 
> > Per https://subversion.apache.org/faq.html#svn-editor, $SVN_EDITOR is 
> > invoked
> > through the shell instead of directly executed.  The user is expected to
> > properly escape/quote $SVN_EDITOR, but svn was putting the filename directly
> > into the command without any escaping.  This therefore breaks attempts to,
> > e.g., run the editor from the merge conflict dialog when a path has special
> > characters.
> > 
> > Update locations where we invoke the editor to quote the filename as well as
> > escape shell special characters using apr_pescape_shell().  The quotes are
> > needed in addition to the escaping, since apr_pescape_shell() does not 
> > escape
> > whitespace.
> 
> > +++ subversion/trunk/subversion/libsvn_subr/cmdline.c Sat Feb 15 16:24:53 
> > 2020
> > @@ -1330,7 +1331,10 @@ svn_cmdline__edit_file_externally(const
> >      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));
> 
> If FILE_NAME is «;» (i.e., a single semicolon), apr_pescape_shell()
> will return «\;» (two bytes) and then the command string will be «vi "\;"»,
> so vi would edit the file «\;» (two bytes).

Ah, indeed.  I was thinking of C strings where backslash must always be
escaped to be literal.  Shells only treat them as an escape for certain
characters.

Well, that makes this more involved... I guess the simplest option is to
do our own scan of the string and pre-escape any whitespace before
having apr_pescape_shell() handle the rest.

Cheers,
-- 
James
GPG Key: 4096R/91BF BF4D 6956 BD5D F7B7  2D23 DFE6 91AE 331B A3DB

Reply via email to