From f46a36427c209de792a5625bee22b2829a7ba56e Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Thu, 31 Jul 2008 22:15:45 +0000 Subject: [PATCH] (forward-button): Avoid infloop. --- lisp/button.el | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lisp/button.el b/lisp/button.el index 6a558af445a..b474a74da9c 100644 --- a/lisp/button.el +++ b/lisp/button.el @@ -437,15 +437,22 @@ Returns the button found." (goto-char (button-start button))) ;; Move to Nth next button (let ((iterator (if (> n 0) #'next-button #'previous-button)) - (wrap-start (if (> n 0) (point-min) (point-max)))) + (wrap-start (if (> n 0) (point-min) (point-max))) + opoint fail) (setq n (abs n)) (setq button t) ; just to start the loop - (while (and (> n 0) button) + (while (and (null fail) (> n 0) button) (setq button (funcall iterator (point))) (when (and (not button) wrap) (setq button (funcall iterator wrap-start t))) (when button (goto-char (button-start button)) + ;; Avoid looping forever (e.g., if all the buttons have + ;; the `skip' property). + (cond ((null opoint) + (setq opoint (point))) + ((= opoint (point)) + (setq fail t))) (unless (button-get button 'skip) (setq n (1- n))))))) (if (null button) -- 2.39.2