]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid assertion violations when using marker positions
authorEli Zaretskii <eliz@gnu.org>
Tue, 6 Sep 2016 16:46:06 +0000 (19:46 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 6 Sep 2016 16:46:06 +0000 (19:46 +0300)
* 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
src/marker.c

index 8451069708c34f304d27a822093cf9f4e21694a4..e797e25ce9c48ec68819718bc5e18d33a42be8b9 100644 (file)
@@ -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
index febdb17689a5d9af8d32b37e97972c5a97f64389..05e5bb87474a96bc7d4e7c50540d7a19ebccf743 100644 (file)
@@ -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