emacs-diffs
[Top][All Lists]
Advanced

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

master 824d1a5: Fix unquoting of file names in subprocesses (Bug#48177)


From: Michael Albinus
Subject: master 824d1a5: Fix unquoting of file names in subprocesses (Bug#48177)
Date: Mon, 3 May 2021 10:52:26 -0400 (EDT)

branch: master
commit 824d1a57ec8e7c90b01af6665de5a114529170df
Author: Michael Albinus <michael.albinus@gmx.de>
Commit: Michael Albinus <michael.albinus@gmx.de>

    Fix unquoting of file names in subprocesses (Bug#48177)
    
    * lisp/files.el (file-name-non-special):
    Improve handling of inhibit-file-name-handlers.
    
    * src/callproc.c (Fcall_process, call_process): Unquote infile,
    error_file and output_file.  (Bug#48177)
    
    * test/lisp/files-tests.el (files-tests-file-name-non-special--subprocess)
    (files-tests-file-name-non-special-file-name-all-completions)
    (files-tests-file-name-non-special-file-name-completion): Adapt tests.
---
 lisp/files.el            |  6 +++++-
 src/callproc.c           | 13 +++++++++++--
 test/lisp/files-tests.el | 24 +++++++++++++-----------
 3 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/lisp/files.el b/lisp/files.el
index 8e8fbac..2c5017a 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -7439,7 +7439,11 @@ only these files will be asked to be saved."
         ;; might be bound to different file name handlers, we still
         ;; need this.
         (saved-file-name-handler-alist file-name-handler-alist)
-        file-name-handler-alist
+        (inhibit-file-name-handlers
+         (cons 'file-name-non-special
+               (and (eq inhibit-file-name-operation operation)
+                    inhibit-file-name-handlers)))
+        (inhibit-file-name-operation operation)
         ;; Some operations respect file name handlers in
         ;; `default-directory'.  Because core function like
         ;; `call-process' don't care about file name handlers in
diff --git a/src/callproc.c b/src/callproc.c
index 5aa2cba..e44e243 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -276,6 +276,9 @@ usage: (call-process PROGRAM &optional INFILE DESTINATION 
DISPLAY &rest ARGS)  *
   else
     infile = build_string (NULL_DEVICE);
 
+  /* Remove "/:" from INFILE.  */
+  infile = remove_slash_colon (infile);
+
   encoded_infile = ENCODE_FILE (infile);
 
   filefd = emacs_open (SSDATA (encoded_infile), O_RDONLY, 0);
@@ -439,9 +442,15 @@ call_process (ptrdiff_t nargs, Lisp_Object *args, int 
filefd,
   current_dir = encode_current_directory ();
 
   if (STRINGP (error_file))
-    error_file = ENCODE_FILE (error_file);
+    {
+      error_file = remove_slash_colon (error_file);
+      error_file = ENCODE_FILE (error_file);
+    }
   if (STRINGP (output_file))
-    output_file = ENCODE_FILE (output_file);
+    {
+      output_file = remove_slash_colon (output_file);
+      output_file = ENCODE_FILE (output_file);
+    }
 
   display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
 
diff --git a/test/lisp/files-tests.el b/test/lisp/files-tests.el
index 3371657..921e2c8 100644
--- a/test/lisp/files-tests.el
+++ b/test/lisp/files-tests.el
@@ -302,12 +302,15 @@ be $HOME."
                     (file-name-unquote temporary-file-directory))))))
 
 (ert-deftest files-tests-file-name-non-special--subprocess ()
-  "Check that Bug#25949 is fixed."
-  (skip-unless (executable-find "true"))
-  (let ((default-directory (file-name-quote temporary-file-directory)))
-    (should (zerop (process-file "true")))
-    (should (processp (start-file-process "foo" nil "true")))
-    (should (zerop (shell-command "true")))))
+  "Check that Bug#25949 and Bug#48177 are fixed."
+  (skip-unless (and (executable-find "true") (file-exists-p null-device)))
+  (let ((default-directory (file-name-quote temporary-file-directory))
+        (true (file-name-quote (executable-find "true")))
+        (null (file-name-quote null-device)))
+    (should (zerop (process-file true null `((:file ,null) ,null))))
+    (should (processp (start-file-process "foo" nil true)))
+    (should (zerop (shell-command true)))
+    (should (processp (make-process :name "foo" :command `(,true))))))
 
 (defmacro files-tests--with-advice (symbol where function &rest body)
   (declare (indent 3))
@@ -715,9 +718,8 @@ unquoted file names."
           (file (file-name-nondirectory tmpfile))
           (nospecial-file (file-name-nondirectory nospecial)))
       (should-not (string-equal file nospecial-file))
-      (should-not (equal (file-name-all-completions
-                          nospecial-file nospecial-tempdir)
-                         (file-name-all-completions file tmpdir)))
+      (should (equal (file-name-all-completions nospecial-file 
nospecial-tempdir)
+                     (file-name-all-completions file tmpdir)))
       (should (equal (file-name-all-completions file nospecial-tempdir)
                      (file-name-all-completions file tmpdir)))
       (should (equal (file-name-all-completions nospecial-file tmpdir)
@@ -759,8 +761,8 @@ unquoted file names."
           (file (file-name-nondirectory tmpfile))
           (nospecial-file (file-name-nondirectory nospecial)))
       (should-not (string-equal file nospecial-file))
-      (should-not (equal (file-name-completion nospecial-file 
nospecial-tempdir)
-                         (file-name-completion file tmpdir)))
+      (should (equal (file-name-completion nospecial-file nospecial-tempdir)
+                     (file-name-completion file tmpdir)))
       (should (equal (file-name-completion file nospecial-tempdir)
                      (file-name-completion file tmpdir)))
       (should (equal (file-name-completion nospecial-file tmpdir)



reply via email to

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