emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-24 680ee61: Backport fix for bug#18745 from master.


From: Eli Zaretskii
Subject: [Emacs-diffs] emacs-24 680ee61: Backport fix for bug#18745 from master.
Date: Tue, 10 Feb 2015 16:52:41 +0000

branch: emacs-24
commit 680ee61d04e220e0b2eb4246c8f33773e0185852
Author: Noam Postavsky <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    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.
---
 nt/ChangeLog  |    6 ++++++
 nt/cmdproxy.c |   29 +++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/nt/ChangeLog b/nt/ChangeLog
index d1f953f..861cb18 100644
--- a/nt/ChangeLog
+++ b/nt/ChangeLog
@@ -1,3 +1,9 @@
+2015-02-10  Noam Postavsky  <address@hidden>
+
+       * 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  <address@hidden>
 
        * cmdproxy.c (get_next_token): Don't make backslashes disappear
diff --git a/nt/cmdproxy.c b/nt/cmdproxy.c
index ce58152..1695628 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))
   {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]