]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid infloop in redisplay when wrap-prefix is too wide
authorEli Zaretskii <eliz@gnu.org>
Wed, 15 Apr 2020 11:28:21 +0000 (14:28 +0300)
committerEli Zaretskii <eliz@gnu.org>
Wed, 15 Apr 2020 11:28:21 +0000 (14:28 +0300)
* src/xdisp.c (move_it_to): Avoid infloop due to wrap-prefix that
is wide enough to leave no space to display even the first
character of the continuation line.  (Bug#40632)

src/xdisp.c

index 193cc372b0e5694dbcd6b8e3efa862f7ffee443a..cce434e66654c1920803fdcfe26a0708a57b75b2 100644 (file)
@@ -9662,9 +9662,13 @@ move_it_to (struct it *it, ptrdiff_t to_charpos, int to_x, int to_y, int to_vpos
   int line_height, line_start_x = 0, reached = 0;
   int max_current_x = 0;
   void *backup_data = NULL;
+  ptrdiff_t orig_charpos = -1;
+  enum it_method orig_method = NUM_IT_METHODS;
 
   for (;;)
     {
+      orig_charpos = IT_CHARPOS (*it);
+      orig_method = it->method;
       if (op & MOVE_TO_VPOS)
        {
          /* If no TO_CHARPOS and no TO_X specified, stop at the
@@ -9898,7 +9902,17 @@ move_it_to (struct it *it, ptrdiff_t to_charpos, int to_x, int to_y, int to_vpos
                }
            }
          else
-           it->continuation_lines_width += it->current_x;
+           {
+             /* Make sure we do advance, otherwise we might infloop.
+                This could happen when the first display element is
+                wider than the window, or if we have a wrap-prefix
+                that doesn't leave enough space after it to display
+                even a single character.  */
+             if (IT_CHARPOS (*it) == orig_charpos
+                 && it->method == orig_method)
+               set_iterator_to_next (it, false);
+             it->continuation_lines_width += it->current_x;
+           }
          break;
 
        default: