Avoid an unusual error when visiting a directory in Dired

* lisp/dired.el (dired-internal-noselect): Unset
'dired--ls-error-buffer' before calling 'dired-readin'.  This is a
safeguard to prevent an error when visiting a directory in Dired,
which apparently happens when the variable somehow gets set even
though 'ls' has not emitted an error message (bug#80499, Message #218).

* test/lisp/dired-tests.el (dired-test-set-dired--ls-error-buffer): New test.
This commit is contained in:
Stephen Berman 2026-06-19 10:13:22 +02:00
parent b6e7962700
commit a94a33827b
2 changed files with 24 additions and 4 deletions

View file

@ -1459,10 +1459,20 @@ The return value is the target column for the file names."
;; (buffer-local), so we can call dired-readin:
(let ((failed t))
(unwind-protect
(progn (dired-readin)
(unless (and dired--ls-error-buffer
(get-buffer "*ls error*"))
(setq failed nil)))
(progn
;; `dired--ls-error-buffer' should only be set in
;; `insert-directory', and if `ls' errors and the buffer
;; displaying the error message pops ups,
;; `dired--ls-error-buffer' is then unset. But if for
;; some reason it gets set before the next Dired
;; buffer-display command is invoked, this can raise an
;; error, so ensure the variable is unset before reading
;; the directory contents into a Dired buffer.
(setq dired--ls-error-buffer nil)
(dired-readin)
(unless (and dired--ls-error-buffer
(get-buffer "*ls error*"))
(setq failed nil)))
;; If either `dired-readin' failed (e.g. if parent directories
;; are inaccessible) or `ls' errored, don't leave the Dired
;; buffer around.

View file

@ -820,5 +820,15 @@ of the value of `dired-auto-toggle-b-switch'."
(let ((dired-auto-toggle-b-switch nil))
(dired-test--filename-with-backslash-n)))
(ert-deftest dired-test-set-dired--ls-error-buffer () ; bug#80499, Message #218
"Test visiting a directory after setting `dired--ls-error-buffer'."
(let ((dir (ert-resource-file (file-name-as-directory "test-dir"))))
(make-directory dir t)
(setq dired--ls-error-buffer (get-buffer-create "*ls error*"))
(find-file dir)
(should (equal list-buffers-directory dir))
(kill-buffer (current-buffer))
(delete-directory dir)))
(provide 'dired-tests)
;;; dired-tests.el ends here