# HG changeset patch # User Bram Moolenaar # Date 1312491568 -7200 # Node ID 7f4f5ca70dbde4e31c2de494b982bfb9bd71ed75 # Parent e7f7a1da21c28159babca07f07eb565c494e0443 updated for version 7.3.269 Problem: 'shellcmdflag' only works with one flag. Solution: Split into multiple arguments. (Gary Johnson) diff --git a/src/os_unix.c b/src/os_unix.c --- a/src/os_unix.c +++ b/src/os_unix.c @@ -3795,8 +3795,10 @@ mch_call_shell(cmd, options) int retval = -1; char **argv = NULL; int argc; + char_u *p_shcf_copy = NULL; int i; char_u *p; + char_u *s; int inquote; int pty_master_fd = -1; /* for pty's */ # ifdef FEAT_GUI @@ -3855,6 +3857,19 @@ mch_call_shell(cmd, options) } if (argv == NULL) { + /* + * Account for possible multiple args in p_shcf. + */ + p = p_shcf; + for (;;) + { + p = skiptowhite(p); + if (*p == NUL) + break; + ++argc; + p = skipwhite(p); + } + argv = (char **)alloc((unsigned)((argc + 4) * sizeof(char *))); if (argv == NULL) /* out of memory */ goto error; @@ -3864,7 +3879,23 @@ mch_call_shell(cmd, options) { if (extra_shell_arg != NULL) argv[argc++] = (char *)extra_shell_arg; - argv[argc++] = (char *)p_shcf; + + /* Break 'shellcmdflag' into white separated parts. This doesn't + * handle quoted strings, they are very unlikely to appear. */ + p_shcf_copy = alloc((unsigned)STRLEN(p_shcf) + 1); + if (p_shcf_copy == NULL) /* out of memory */ + goto error; + s = p_shcf_copy; + p = p_shcf; + while (*p != NUL) + { + argv[argc++] = (char *)s; + while (*p && *p != ' ' && *p != TAB) + *s++ = *p++; + *s++ = NUL; + p = skipwhite(p); + } + argv[argc++] = (char *)cmd; } argv[argc] = NULL; @@ -4677,6 +4708,7 @@ finished: } } vim_free(argv); + vim_free(p_shcf_copy); error: if (!did_settmode) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 269, +/**/ 268, /**/ 267,