(display_mode_element): Detect cycles.
authorAndreas Schwab <schwab@linux-m68k.org>
Fri, 11 Sep 2009 16:46:08 +0000 (16:46 +0000)
committerAndreas Schwab <schwab@linux-m68k.org>
Fri, 11 Sep 2009 16:46:08 +0000 (16:46 +0000)
src/ChangeLog
src/xdisp.c

index de2c7c3..d06faa3 100644 (file)
@@ -1,3 +1,7 @@
+2009-09-11  Andreas Schwab  <schwab@linux-m68k.org>
+
+       * xdisp.c (display_mode_element): Detect cycles.
+
 2009-09-11  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * keymap.c (where_is_internal): Don't erroneously return nil right after
index 9108ab6..58a077f 100644 (file)
@@ -17750,14 +17750,10 @@ display_mode_element (it, depth, field_width, precision, elt, props, risky)
          }
        else if (STRINGP (car) || CONSP (car))
          {
-           register int limit = 5000;
-           /* Limit is to protect against circular lists.
-              The limit used to be 50, but if you use enough minor modes,
-              minor-mode-alist will easily grow past 50.  Circular lists
-              are rather unlikely, so it's better for the limit to be
-              "too large" rather than "too small".  */
+           Lisp_Object halftail = elt;
+           int len = 0;
+
            while (CONSP (elt)
-                  && --limit > 0
                   && (precision <= 0 || n < precision))
              {
                n += display_mode_element (it, depth,
@@ -17769,6 +17765,12 @@ display_mode_element (it, depth, field_width, precision, elt, props, risky)
                                           precision - n, XCAR (elt),
                                           props, risky);
                elt = XCDR (elt);
+               len++;
+               if ((len & 1) == 0)
+                 halftail = XCDR (halftail);
+               /* Check for cycle.  */
+               if (EQ (halftail, elt))
+                 break;
              }
          }
       }