Commit 644f77b5 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

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)
parent dcfcc595
......@@ -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
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment