aboutsummaryrefslogtreecommitdiffstats
path: root/nt/cmdproxy.c
diff options
context:
space:
mode:
authorNoam Postavsky2014-10-25 12:12:01 +0300
committerEli Zaretskii2014-10-25 12:12:01 +0300
commita91ff4f4b1d835cc2c723429c06ddcb357f807c8 (patch)
treef32ac836d8644b60cbd6408acd4de9967c70e53a /nt/cmdproxy.c
parentb5dc75aed71ecb2310a6689e2f7082243aa7e4ab (diff)
downloademacs-a91ff4f4b1d835cc2c723429c06ddcb357f807c8.tar.gz
emacs-a91ff4f4b1d835cc2c723429c06ddcb357f807c8.zip
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)
220 return o - buf; 220 return o - buf;
221} 221}
222 222
223/* Return TRUE if PROGNAME is a batch file. */
224BOOL
225batch_file_p (const char *progname)
226{
227 const char *exts[] = {".bat", ".cmd"};
228 int n_exts = sizeof (exts) / sizeof (char *);
229 int i;
230
231 const char *ext = strrchr (progname, '.');
232
233 if (ext)
234 {
235 for (i = 0; i < n_exts; i++)
236 {
237 if (stricmp (ext, exts[i]) == 0)
238 return TRUE;
239 }
240 }
241
242 return FALSE;
243}
244
223/* Search for EXEC file in DIR. If EXEC does not have an extension, 245/* Search for EXEC file in DIR. If EXEC does not have an extension,
224 DIR is searched for EXEC with the standard extensions appended. */ 246 DIR is searched for EXEC with the standard extensions appended. */
225int 247int
@@ -470,6 +492,13 @@ spawn (const char *progname, char *cmdline, const char *dir, int *retcode)
470 memset (&start, 0, sizeof (start)); 492 memset (&start, 0, sizeof (start));
471 start.cb = sizeof (start); 493 start.cb = sizeof (start);
472 494
495 /* CreateProcess handles batch files as progname specially. This
496 special handling fails when both the batch file and arguments are
497 quoted. We pass NULL as progname to avoid the special
498 handling. */
499 if (progname != NULL && cmdline[0] == '"' && batch_file_p (progname))
500 progname = NULL;
501
473 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE, 502 if (CreateProcess (progname, cmdline, &sec_attrs, NULL, TRUE,
474 0, envblock, dir, &start, &child)) 503 0, envblock, dir, &start, &child))
475 { 504 {