]> git.eshelyaron.com Git - emacs.git/commitdiff
Mention that shell quoting of % on w32 may fail (Bug#19350)
authorNoam Postavsky <npostavs@gmail.com>
Tue, 6 Feb 2018 18:17:07 +0000 (13:17 -0500)
committerNoam Postavsky <npostavs@gmail.com>
Fri, 9 Feb 2018 00:10:11 +0000 (19:10 -0500)
* doc/lispref/os.texi (Security Considerations): Mention that quoting
of '%' assumes no '^' in variable names.
* test/lisp/subr-tests.el (shell-quote-argument-%-on-w32): New test,
demonstrating what doesn't work.

doc/lispref/os.texi
test/lisp/subr-tests.el

index 9352a929a7a834216985522ae8e01b789de31727..42be60449de0e977f5e76de8e00644148abf90c1 100644 (file)
@@ -3042,7 +3042,9 @@ with @samp{-}, or might contain shell metacharacters like @samp{;}.
 Although functions like @code{shell-quote-argument} can help avoid
 this sort of problem, they are not panaceas; for example, on a POSIX
 platform @code{shell-quote-argument} quotes shell metacharacters but
-not leading @samp{-}.  @xref{Shell Arguments}.  Typically it is safer
+not leading @samp{-}.  On MS-Windows, quoting for @samp{%} assumes
+none of the environment variables have @samp{^} in their name.
+@xref{Shell Arguments}.  Typically it is safer
 to use @code{call-process} than a subshell.  @xref{Synchronous
 Processes}.  And it is safer yet to use builtin Emacs functions; for
 example, use @code{(rename-file "@var{a}" "@var{b}" t)} instead of
index efafdcf83257ec0ff2bd6c0b9e534aebe18f5ce9..430d719037fed9116e6c37ae2f6d2020378f6198 100644 (file)
@@ -307,5 +307,22 @@ cf. Bug#25477."
   (should (eq (string-to-char (symbol-name (gensym))) ?g))
   (should (eq (string-to-char (symbol-name (gensym "X"))) ?X)))
 
+(ert-deftest shell-quote-argument-%-on-w32 ()
+  "Quoting of `%' in w32 shells isn't perfect.
+See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=19350."
+  :expected-result :failed
+  (skip-unless (and (fboundp 'w32-shell-dos-semantics)
+                    (w32-shell-dos-semantics)))
+  (let ((process-environment (append '("ca^=with-caret"
+                                       "ca=without-caret")
+                                     process-environment)))
+    ;; It actually results in
+    ;;    without-caret with-caret
+    (should (equal (shell-command-to-string
+                    (format "echo %s %s"
+                            "%ca%"
+                            (shell-quote-argument "%ca%")))
+                   "without-caret %ca%"))))
+
 (provide 'subr-tests)
 ;;; subr-tests.el ends here