summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/simple.el7
2 files changed, 12 insertions, 1 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index e90693180a8..f5f3208256e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2014-04-12 Barry O'Reilly <gundaetiapo@gmail.com>
+
+ * simple.el (undo): Prevent insertion of identity mapping into
+ undo-equiv-table so as undo-only does not inf loop in the presence
+ of consecutive nils in undo list.
+
2014-04-12 Matthias Dahl <matthias.dahl@binary-island.eu>
* faces.el (make-face): Deprecate optional argument as it is no
diff --git a/lisp/simple.el b/lisp/simple.el
index 68bfd7b14f4..a5e8381eaaa 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -2143,7 +2143,12 @@ as an argument limits undo to changes within the current region."
;; above when checking.
(while (eq (car list) nil)
(setq list (cdr list)))
- (puthash list (if undo-in-region t pending-undo-list)
+ (puthash list
+ ;; Prevent identity mapping. This can happen if
+ ;; consecutive nils are erroneously in undo list.
+ (if (or undo-in-region (eq list pending-undo-list))
+ t
+ pending-undo-list)
undo-equiv-table))
;; Don't specify a position in the undo record for the undo command.
;; Instead, undoing this should move point to where the change is.