From 5e2e0fa4565f2496fa5db299e30d6b08088cedde Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 21 May 2014 18:03:18 +0300 Subject: [PATCH] Fix bug #17539 with infinite recursion during scroll commands. src/xdisp.c (move_it_in_display_line_to): Avoid infinite recursion: when closest_pos is identical to to_charpos, don't recurse, since we already tried that, and failed. --- src/ChangeLog | 6 ++++++ src/xdisp.c | 16 +++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index cb54bbd0e70..1e6bdcb4999 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2014-05-21 Eli Zaretskii + + * xdisp.c (move_it_in_display_line_to): Avoid infinite recursion: + when closest_pos is identical to to_charpos, don't recurse, since + we already tried that, and failed. (Bug#17539) + 2014-05-20 Eli Zaretskii * w32fns.c (unwind_create_frame) [GLYPH_DEBUG]: If we are diff --git a/src/xdisp.c b/src/xdisp.c index 88d61a6bbc0..e9c3cb1aac6 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -8812,8 +8812,11 @@ move_it_in_display_line_to (struct it *it, if (closest_pos < ZV) { RESTORE_IT (it, &ppos_it, ppos_data); - move_it_in_display_line_to (it, closest_pos, -1, - MOVE_TO_POS); + /* Don't recurse if closest_pos is equal to + to_charpos, since we have just tried that. */ + if (closest_pos != to_charpos) + move_it_in_display_line_to (it, closest_pos, -1, + MOVE_TO_POS); result = MOVE_POS_MATCH_OR_ZV; } else @@ -8874,8 +8877,9 @@ move_it_in_display_line_to (struct it *it, && !at_eob_p && closest_pos < ZV) { RESTORE_IT (it, &ppos_it, ppos_data); - move_it_in_display_line_to (it, closest_pos, -1, - MOVE_TO_POS); + if (closest_pos != to_charpos) + move_it_in_display_line_to (it, closest_pos, -1, + MOVE_TO_POS); } result = MOVE_POS_MATCH_OR_ZV; break; @@ -8893,7 +8897,9 @@ move_it_in_display_line_to (struct it *it, if (closest_pos < ZV) { RESTORE_IT (it, &ppos_it, ppos_data); - move_it_in_display_line_to (it, closest_pos, -1, MOVE_TO_POS); + if (closest_pos != to_charpos) + move_it_in_display_line_to (it, closest_pos, -1, + MOVE_TO_POS); } result = MOVE_POS_MATCH_OR_ZV; break; -- 2.39.5