emacs-31 165152e7cdc: Fix an infloop during cursor movement
Eli Zaretskii <[email protected]>
| Newsgroups | gmane.emacs.diffs |
|---|---|
| Message-ID | <[email protected]> |
branch: emacs-31 commit 165152e7cdc7802735004b81c70219c4ae6002ab Author: Eli Zaretskii <[email protected]> Commit: Eli Zaretskii <[email protected]> Fix an infloop during cursor movement * src/xdisp.c (move_it_vertically_backward): Prevent infloop due to overlays with embedded newlines at BOB. (Bug#81567) --- src/xdisp.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/xdisp.c b/src/xdisp.c index 5377d5e8ada..b3227ce4937 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -11298,10 +11298,18 @@ move_it_vertically_backward (struct it *it, int dy) y-distance. */ SAVE_IT (it2, *it, it2data); it2.max_ascent = it2.max_descent = 0; + ptrdiff_t to_pos = start_pos; do { + /* Avoid inflooping of there's a large display string with several + embedded newlines, which makes move_it_to stop after START_POS + but still inside a display or overlay string. */ + if (IT_CHARPOS (it2) >= start_pos) + to_pos = -1; move_it_to (&it2, start_pos, -1, -1, it2.vpos + 1, - MOVE_TO_POS | MOVE_TO_VPOS); + (to_pos > 0 + ? (MOVE_TO_POS | MOVE_TO_VPOS) + : MOVE_TO_VPOS)); } while (!(IT_POS_VALID_AFTER_MOVE_P (&it2) /* If we are in a display string which starts at START_POS,