summaryrefslogtreecommitdiff
path: root/nt/cmdproxy.c
diff options
context:
space:
mode:
authorNoam Postavsky <npostavs@gmail.com>2014-10-25 12:12:01 +0300
committerEli Zaretskii <eliz@gnu.org>2014-10-25 12:12:01 +0300
commita91ff4f4b1d835cc2c723429c06ddcb357f807c8 (patch)
treef32ac836d8644b60cbd6408acd4de9967c70e53a /nt/cmdproxy.c
parentb5dc75aed71ecb2310a6689e2f7082243aa7e4ab (diff)
downloademacs-a91ff4f4b1d835cc2c723429c06ddcb357f807c8.tar.gz
Fix bug #18745 with invoking Windows batch files with embedded whitespace.
src/w32proc.c (create_child): If calling a quoted batch file, pass NULL for exe. nt/cmdproxy.c (batch_file_p): New function. (spawn): If calling a quoted batch file pass NULL for progname. test/automated/process-tests.el (process-test-quoted-batfile): New test.
Diffstat (limited to 'nt/cmdproxy.c')
-rw-r--r--nt/cmdproxy.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c
index e48ca63a257..d8f7ae3c41e 100644
--- a/nt/cmdproxy.c
+++ b/nt/cmdproxy.c
@@ -220,6 +220,28 @@ get_next_token (char * buf, const char ** pSrc)
return o - buf;
}
+/* Return TRUE if PROGNAME is a batch file. */
+BOOL
+batch_file_p (const char *progname)
+{
+ const char *exts[] = {".bat", ".cmd"};
+ int n_exts = sizeof (exts) / sizeof (char *);
+ int i;
+
+ const char *ext = strrchr (progname, '.');
+
+ if (ext)
+ {
+ for (i = 0; i < n_exts; i++)
+ {
+ if (stricmp (ext, exts[i]) == 0)
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
/* Search for EXEC file in DIR. If EXEC does not have an extension,
DIR is searched for EXEC with the standard extensions appended. */
int
@@ -470,6 +492,13 @@ spawn (const char *progname, char *cmdline, const char *dir, int *retcode)
memset (&start, 0, sizeof (start));
start.cb = sizeof (start);
+ /* CreateProcess handles batch files as progname specially. This
+ special handling fails when both the batch file and arguments are
+ quoted. We pass NULL as progname to avoid the special
+ handling. */
+ if (progname != NULL && cmdline[0] == '"' && batch_file_p (progname))
+ progname = NULL;
+
if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
0, envblock, dir, &start, &child))
{