From: Eli Zaretskii Date: Fri, 12 Jul 2024 06:58:53 +0000 (+0300) Subject: Fix infloop in 'shell-resync-dirs' X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ab66afd6f5e857e41cefe8e2a24e586d64b39ea3;p=emacs.git 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 . (cherry picked from commit 8b1a0f8695a43e74daa5275559267e96c14aba03) --- diff --git a/lisp/shell.el b/lisp/shell.el index 89ec893a308..835b300406f 100644 --- a/lisp/shell.el +++ b/lisp/shell.el @@ -1254,7 +1254,7 @@ line output and parses it to form the new directory stack." (while dlsl (let ((newelt "") tem1 tem2) - (while newelt + (while (and dlsl newelt) ;; We need tem1 because we don't want to prepend ;; `comint-file-name-prefix' repeatedly into newelt via tem2. (setq tem1 (pop dlsl) @@ -1628,10 +1628,14 @@ Returns t if successful." ;; a newline). This is far from fool-proof -- if something ;; outputs incomplete data and then sleeps, we'll think ;; we've received the prompt. - (while (not (let* ((lines (string-lines result)) - (last (car (last lines)))) + (while (not (let* ((lines (string-lines result nil t)) + (last (car (last lines))) + (last-end (if (equal last "") + last + (substring last -1)))) (and (length> lines 0) - (not (equal last "")) + (not (member last '("" "\n"))) + (not (equal last-end "\n")) (or (not prev) (not (equal last prev))) (setq prev last))))