From: Eli Zaretskii Date: Wed, 21 May 2014 15:03:18 +0000 (+0300) Subject: Fix bug #17539 with infinite recursion during scroll commands. X-Git-Tag: emacs-24.3.92~181 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5e2e0fa4565f2496fa5db299e30d6b08088cedde;p=emacs.git 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. --- 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;