Limit recursion depth of c-forward-<>-arglist-recur (Bug#7722).
authorChong Yidong <cyd@stupidchicken.com>
Thu, 27 Jan 2011 00:51:41 +0000 (19:51 -0500)
committerChong Yidong <cyd@stupidchicken.com>
Thu, 27 Jan 2011 00:51:41 +0000 (19:51 -0500)
* progmodes/cc-engine.el (c-forward-<>-arglist-recur): Set a limit
to the recursion depth.

lisp/ChangeLog
lisp/progmodes/cc-engine.el

index 39fe96a..41db2b5 100644 (file)
@@ -1,3 +1,8 @@
+2011-01-27  Chong Yidong  <cyd@stupidchicken.com>
+
+       * progmodes/cc-engine.el (c-forward-<>-arglist-recur): Set a limit
+       to the recursion depth (Bug#7722).
+
 2011-01-26  Roy Liu <carsomyr@gmail.com> (tiny change)
 
        * term/ns-win.el (ns-find-file): Expand ns-input-file with
index 5fd418d..f96cd1b 100644 (file)
@@ -4393,6 +4393,8 @@ comment at the start of cc-engine.el for more info."
       (goto-char safe-pos)
       t)))
 
+(defvar c-forward-<>-arglist-recur-depth)
+
 (defun c-forward-<>-arglist (all-types)
   ;; The point is assumed to be at a "<".  Try to treat it as the open
   ;; paren of an angle bracket arglist and move forward to the
@@ -4418,7 +4420,8 @@ comment at the start of cc-engine.el for more info."
        ;; If `c-record-type-identifiers' is set then activate
        ;; recording of any found types that constitute an argument in
        ;; the arglist.
-       (c-record-found-types (if c-record-type-identifiers t)))
+       (c-record-found-types (if c-record-type-identifiers t))
+       (c-forward-<>-arglist-recur--depth 0))
     (if (catch 'angle-bracket-arglist-escape
          (setq c-record-found-types
                (c-forward-<>-arglist-recur all-types)))
@@ -4434,6 +4437,14 @@ comment at the start of cc-engine.el for more info."
       nil)))
 
 (defun c-forward-<>-arglist-recur (all-types)
+
+  ;; Temporary workaround for Bug#7722.
+  (when (boundp 'c-forward-<>-arglist-recur--depth)
+    (if (> c-forward-<>-arglist-recur--depth 200)
+       (error "Max recursion depth reached in <> arglist")
+      (setq c-forward-<>-arglist-recur--depth
+           (1+ c-forward-<>-arglist-recur--depth))))
+
   ;; Recursive part of `c-forward-<>-arglist'.
   ;;
   ;; This function might do hidden buffer changes.