1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-08 07:20:28 -08:00

Fix infloop in 'shell-resync-dirs'

* lisp/shell.el (shell-eval-command): Fix detection of newline
after last output line.  (Bug#71896)
(shell-resync-dirs): Make sure the inner loop never infloops.
Suggested by Troy Hinckley <troyhinckley@dabrev.com>.
This commit is contained in:
Eli Zaretskii 2024-07-12 09:58:53 +03:00
parent ce13eee5ab
commit 8b1a0f8695

View file

@ -1255,7 +1255,7 @@ line output and parses it to form the new directory stack."
(while dlsl (while dlsl
(let ((newelt "") (let ((newelt "")
tem1 tem2) tem1 tem2)
(while newelt (while (and dlsl newelt)
;; We need tem1 because we don't want to prepend ;; We need tem1 because we don't want to prepend
;; `comint-file-name-prefix' repeatedly into newelt via tem2. ;; `comint-file-name-prefix' repeatedly into newelt via tem2.
(setq tem1 (pop dlsl) (setq tem1 (pop dlsl)
@ -1629,10 +1629,14 @@ Returns t if successful."
;; a newline). This is far from fool-proof -- if something ;; a newline). This is far from fool-proof -- if something
;; outputs incomplete data and then sleeps, we'll think ;; outputs incomplete data and then sleeps, we'll think
;; we've received the prompt. ;; we've received the prompt.
(while (not (let* ((lines (string-lines result)) (while (not (let* ((lines (string-lines result nil t))
(last (car (last lines)))) (last (car (last lines)))
(last-end (if (equal last "")
last
(substring last -1))))
(and (length> lines 0) (and (length> lines 0)
(not (equal last "")) (not (member last '("" "\n")))
(not (equal last-end "\n"))
(or (not prev) (or (not prev)
(not (equal last prev))) (not (equal last prev)))
(setq prev last)))) (setq prev last))))