1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-14 09:39:42 +00:00

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.
This commit is contained in:
Michael Albinus 2021-05-03 16:52:18 +02:00
parent 46b7ce0e9c
commit 824d1a57ec
3 changed files with 29 additions and 14 deletions

View File

@ -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

View File

@ -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]);

View File

@ -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)