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:
parent
46b7ce0e9c
commit
824d1a57ec
@ -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
|
||||
|
@ -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 = remove_slash_colon (error_file);
|
||||
error_file = ENCODE_FILE (error_file);
|
||||
}
|
||||
if (STRINGP (output_file))
|
||||
{
|
||||
output_file = remove_slash_colon (output_file);
|
||||
output_file = ENCODE_FILE (output_file);
|
||||
}
|
||||
|
||||
display_p = INTERACTIVE && nargs >= 4 && !NILP (args[3]);
|
||||
|
||||
|
@ -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,8 +718,7 @@ 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)
|
||||
(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)))
|
||||
@ -759,7 +761,7 @@ 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)
|
||||
(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)))
|
||||
|
Loading…
Reference in New Issue
Block a user