From ab66afd6f5e857e41cefe8e2a24e586d64b39ea3 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 12 Jul 2024 09:58:53 +0300 Subject: [PATCH] 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) --- lisp/shell.el | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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)))) -- 2.39.2