From 644f77b517180c5f75a9eaac4d76b12a1f334ce6 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 6 Sep 2016 19:46:06 +0300 Subject: Avoid assertion violations when using marker positions * src/intervals.c (set_point_from_marker): If MARKER comes from another buffer, recalculate its byte position before using it to set point. * src/marker.c (set_marker_internal): If POSITION is a marker from another buffer, recalculate its byte position before using it. (Bug#24368) --- src/intervals.c | 13 +++++++++---- src/marker.c | 6 +++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/intervals.c b/src/intervals.c index 8451069708..e797e25ce9 100644 --- a/src/intervals.c +++ b/src/intervals.c @@ -1821,11 +1821,16 @@ set_point (ptrdiff_t charpos) void set_point_from_marker (Lisp_Object marker) { + ptrdiff_t charpos = clip_to_bounds (BEGV, marker_position (marker), ZV); + ptrdiff_t bytepos = marker_byte_position (marker); + + /* Don't trust the byte position if the marker belongs to a + different buffer. */ if (XMARKER (marker)->buffer != current_buffer) - signal_error ("Marker points into wrong buffer", marker); - set_point_both - (clip_to_bounds (BEGV, marker_position (marker), ZV), - clip_to_bounds (BEGV_BYTE, marker_byte_position (marker), ZV_BYTE)); + bytepos = buf_charpos_to_bytepos (current_buffer, charpos); + else + bytepos = clip_to_bounds (BEGV_BYTE, bytepos, ZV_BYTE); + set_point_both (charpos, bytepos); } /* If there's an invisible character at position POS + TEST_OFFS in the diff --git a/src/marker.c b/src/marker.c index febdb17689..05e5bb8747 100644 --- a/src/marker.c +++ b/src/marker.c @@ -507,7 +507,11 @@ set_marker_internal (Lisp_Object marker, Lisp_Object position, charpos = clip_to_bounds (restricted ? BUF_BEGV (b) : BUF_BEG (b), charpos, restricted ? BUF_ZV (b) : BUF_Z (b)); - if (bytepos == -1) + /* Don't believe BYTEPOS if it comes from a different buffer, + since that buffer might have a very different correspondence + between character and byte positions. */ + if (bytepos == -1 + || !(MARKERP (position) && XMARKER (position)->buffer == b)) bytepos = buf_charpos_to_bytepos (b, charpos); else bytepos = clip_to_bounds -- cgit v1.2.3