Bug#542430: Incorrect wildcard expansion when p_sh has arguments to the shell

James Vega vega.james at gmail.com
Tue Nov 3 22:44:22 UTC 2009


On Tue, Nov 03, 2009 at 10:52:28PM +0100, Bram Moolenaar wrote:
> 
> James -
> 
> > The code in src/os_unix.c:mch_expand_wildcards which detects what shell
> > is being used doesn't work properly if 'shell' has been set to a shell
> > and arguments (e.g., "/bin/tcsh -f").
> > 
> > 5354     else if ((len = STRLEN(p_sh)) >= 3)
> > 5355     {
> > 5356         if (STRCMP(p_sh + len - 3, "csh") == 0)
> > 5357             shell_style = STYLE_GLOB;
> > 5358         else if (STRCMP(p_sh + len - 3, "zsh") == 0)
> > 5359             shell_style = STYLE_PRINT;
> > 5360     }
> > 5361     if (shell_style == STYLE_ECHO && strstr((char *)gettail(p_sh),
> > 5362
> > "sh") != NULL)
> > 5363         shell_style = STYLE_VIMGLOB;
> > 
> > Vim checks whether the last 3 characters of 'shell' are "csh".  Since
> > the last 3 characters of p_sh in this case are " -f", Vim then checks
> > whether "sh" is in gettail(p_sh) and uses sh-compatible shell expansion.
> > 
> > It looks like a safer approach would be to grab p_sh up to the first
> > whitespace and then use gettail() on that to get the shell name.  That
> > should reduce the false-positive rate for setting STYLE_VIMGLOB in line
> > 5363.
> > 
> > Although, it'll still fail with shells like fish which will pass the
> > strstr(..., "sh") check but not work with STYLE_VIMGLOB.  fish does work
> > with STYLE_ECHO, so we could add that to the special-case list.
> 
> Well, theoretically there could be a space in the path.

I thought of that, but I figured that was quite unlikely to happen on
unix systems.

> I think
> searching for the last slash, using gettail(), can comparing from that
> position should work in most cases.

That was my original idea, but that fails if the arguments after the
shell contain slashes.  Then again, that may be just as uncommon as
having spaces in the path.

> To catch "tcsh" as well as "csh" we can use "strstr" on gettail().

The current method of detecting (t)csh works fine. It's just that the
string being used to do the detection contains too much information.

-- 
James
GPG Key: 1024D/61326D40 2003-09-02 James Vega <vega.james at gmail.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/pkg-vim-maintainers/attachments/20091103/8eed56ec/attachment.pgp>


More information about the pkg-vim-maintainers mailing list