forked from pool/emacs
48 lines
1.6 KiB
Diff
48 lines
1.6 KiB
Diff
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:
|