]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid infloop in 'format-mode-line'
authorEli Zaretskii <eliz@gnu.org>
Tue, 7 Jul 2020 14:08:19 +0000 (17:08 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 7 Jul 2020 14:08:19 +0000 (17:08 +0300)
* src/xdisp.c (decode_mode_spec): Don't use W->start if it is
outside of the buffer's accessible region.  (Bug#42220)

src/xdisp.c

index 269777a5b1506d375752c8e8e27f8826a049995b..bc82d0acc0d732a233adbb624be7704292330788 100644 (file)
@@ -26342,6 +26342,22 @@ decode_mode_spec (struct window *w, register int c, int field_width,
        startpos = marker_position (w->start);
        startpos_byte = marker_byte_position (w->start);
        height = WINDOW_TOTAL_LINES (w);
+       /* We cannot cope with w->start being outside of the
+          accessible portion of the buffer; in particular,
+          display_count_lines call below will infloop if called with
+          startpos_byte outside of the [BEGV_BYTE..ZV_BYTE] region.
+          Such w->start means we were called in some "creative" way
+          when the buffer's restriction was changed, but the window
+          wasn't yet redisplayed after that.  If that happens, we
+          need to determine a new base line.  */
+       if (!(BUF_BEGV_BYTE (b) <= startpos_byte
+             && startpos_byte <= BUF_ZV_BYTE (b)))
+         {
+           startpos = BUF_BEGV (b);
+           startpos_byte = BUF_BEGV_BYTE (b);
+           w->base_line_pos = 0;
+           w->base_line_number = 0;
+         }
 
        /* If we decided that this buffer isn't suitable for line numbers,
           don't forget that too fast.  */