summaryrefslogtreecommitdiff
path: root/nt
diff options
context:
space:
mode:
authorNoam Postavsky <npostavs@users.sourceforget.net>2015-02-10 18:51:14 +0200
committerEli Zaretskii <eliz@gnu.org>2015-02-10 18:51:14 +0200
commit680ee61d04e220e0b2eb4246c8f33773e0185852 (patch)
tree026af2929f7f38f4c1725208301de3f4f6a026e8 /nt
parent4b0b27d0018f040bda6a2ec885fa54c666d9c083 (diff)
Backport fix for bug#18745 from master.
nt/cmdproxy.c (batch_file_p): New function. (spawn): If calling a quoted batch file pass NULL for progname.
Diffstat (limited to 'nt')
-rw-r--r--nt/ChangeLog6
-rw-r--r--nt/cmdproxy.c29
2 files changed, 35 insertions, 0 deletions
diff --git a/nt/ChangeLog b/nt/ChangeLog
index d1f953f9ac..861cb18f0b 100644
--- a/nt/ChangeLog
+++ b/nt/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-10 Noam Postavsky <npostavs@users.sourceforget.net>
+
+ * nt/cmdproxy.c (batch_file_p): New function.
+ (spawn): If calling a quoted batch file pass NULL for progname.
+ (Bug#18745)
+
2015-02-10 Eli Zaretskii <eliz@gnu.org>
* cmdproxy.c (get_next_token): Don't make backslashes disappear
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c
index ce5815291d..16956288fe 100644
--- a/nt/cmdproxy.c
+++ b/nt/cmdproxy.c
@@ -243,6 +243,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
@@ -524,6 +546,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))
{