]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid a redisplay loop when 'overlay-arrow-string' is non-ASCII
authorEli Zaretskii <eliz@gnu.org>
Thu, 21 Apr 2022 20:18:42 +0000 (23:18 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 21 Apr 2022 20:18:42 +0000 (23:18 +0300)
* src/xdisp.c (get_overlay_arrow_glyph_row): Don't assume every
character in 'overlay-arrow-string' is one byte long.  Reported by
Yuri D'Elia <wavexx@thregr.org>.

src/xdisp.c

index 15bb5eefb56ed16e7d551371404df9761de2e92e..71de3592227ccf045da6f52a3829f095756201e9 100644 (file)
@@ -21653,7 +21653,7 @@ get_overlay_arrow_glyph_row (struct window *w, Lisp_Object overlay_arrow_string)
   struct buffer *buffer = XBUFFER (w->contents);
   struct buffer *old = current_buffer;
   const unsigned char *arrow_string = SDATA (overlay_arrow_string);
-  ptrdiff_t arrow_len = SCHARS (overlay_arrow_string);
+  ptrdiff_t arrow_len = SCHARS (overlay_arrow_string), nchars = 0;
   const unsigned char *arrow_end = arrow_string + arrow_len;
   const unsigned char *p;
   struct it it;
@@ -21684,7 +21684,7 @@ get_overlay_arrow_glyph_row (struct window *w, Lisp_Object overlay_arrow_string)
       p += it.len;
 
       /* Get its face.  */
-      ilisp = make_fixnum (p - arrow_string);
+      ilisp = make_fixnum (nchars++);
       face = Fget_text_property (ilisp, Qface, overlay_arrow_string);
       it.face_id = compute_char_face (f, it.char_to_display, face);