File boo1178942-bedb3cb6.patch of Package emacs.33222

From bedb3cb66541fd4dd35cf15261c6d99f132e7d2c Mon Sep 17 00:00:00 2001
From: Eli Zaretskii <eliz@gnu.org>
Date: Wed, 15 Apr 2020 14:28:21 +0300
Subject: [PATCH] Avoid infloop in redisplay when wrap-prefix is too wide

* 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 |   16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

--- src/xdisp.c
+++ src/xdisp.c	2021-09-09 10:14:45.107931449 +0000
@@ -9727,9 +9727,13 @@ move_it_to (struct it *it, ptrdiff_t to_
   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
@@ -9963,7 +9967,17 @@ move_it_to (struct it *it, ptrdiff_t to_
 		}
 	    }
 	  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:
openSUSE Build Service is sponsored by