diff options
author | Eli Zaretskii <eliz@gnu.org> | 2016-09-06 19:46:06 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2016-09-06 19:46:06 +0300 |
commit | 644f77b517180c5f75a9eaac4d76b12a1f334ce6 (patch) | |
tree | ecdbd5a36616cbc954ccd4e3de2e2ae8e039bb0e /src/intervals.c | |
parent | dcfcc595339f8bd503dedf95976b8a3633382f4f (diff) | |
download | emacs-644f77b517180c5f75a9eaac4d76b12a1f334ce6.tar.gz |
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)
Diffstat (limited to 'src/intervals.c')
-rw-r--r-- | src/intervals.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/src/intervals.c b/src/intervals.c index 8451069708c..e797e25ce9c 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 |