]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent aborts in line-move-visual
authorEli Zaretskii <eliz@gnu.org>
Fri, 17 Nov 2017 19:37:04 +0000 (21:37 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 17 Nov 2017 19:37:04 +0000 (21:37 +0200)
* src/indent.c (line_number_display_width): Avoid assertion
violations in init_iterator when the window's buffer was
temporarily switched without updating window-start.  (Bug#29326)

src/indent.c

index 192eec72efe1b0e8050f578b6fcd817c8312f497..5f931a511e447b3bf232f089cdc6032a4c5c59aa 100644 (file)
@@ -1959,21 +1959,26 @@ line_number_display_width (struct window *w, int *width, int *pixel_width)
   else
     {
       struct it it;
-      struct text_pos wstart;
+      struct text_pos startpos;
       bool saved_restriction = false;
       ptrdiff_t count = SPECPDL_INDEX ();
-      SET_TEXT_POS_FROM_MARKER (wstart, w->start);
+      SET_TEXT_POS_FROM_MARKER (startpos, w->start);
       void *itdata = bidi_shelve_cache ();
-      /* We must start from window's start point, but it could be
-        outside the accessible region.  */
-      if (wstart.charpos < BEGV || wstart.charpos > ZV)
+      /* We want to start from window's start point, but it could be
+        outside the accessible region, in which case we widen the
+        buffer temporarily.  It could even be beyond the buffer's end
+        (Org mode's display of source code snippets is known to cause
+        that), in which case we just punt and start from point instead.  */
+      if (startpos.charpos > Z)
+       SET_TEXT_POS (startpos, PT, PT_BYTE);
+      if (startpos.charpos < BEGV || startpos.charpos > ZV)
        {
          record_unwind_protect (save_restriction_restore,
                                 save_restriction_save ());
          Fwiden ();
          saved_restriction = true;
        }
-      start_display (&it, w, wstart);
+      start_display (&it, w, startpos);
       /* The call to move_it_by_lines below will not generate a line
         number if the first line shown in the window is hscrolled
         such that all of its display elements are out of view.  So we