From 13fe68ebc2eb2fe7ca0ee4ac4733b3abc3ed0cab Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Mon, 19 Aug 2024 17:38:47 -0700 Subject: [PATCH] Fix bad interaction between 'min-width' display spec and overlays Previously, when iterating over overlays, we would pass the overlay string and the buffer position to 'display_min_width', which would use those values to try to get the display property. However, the buffer position is very likely out of bounds for the overlay string! * src/xdisp.c (get_display_property): Rename BUFPOS to CHARPOS. (display_min_width): Take CHARPOS instead of BUFPOS, and get BUFPOS on our own. This way, we can be sure that when calling 'get_display_property', we provide it with the correct kind of position. (handle_display_prop): Pass the character pos of OBJECT's position to 'display_min_width' (bug#72721). --- src/xdisp.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/xdisp.c b/src/xdisp.c index 30771a1c83d..af93a824bee 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5633,17 +5633,19 @@ find_display_property (Lisp_Object disp, Lisp_Object prop) } static Lisp_Object -get_display_property (ptrdiff_t bufpos, Lisp_Object prop, Lisp_Object object) +get_display_property (ptrdiff_t charpos, Lisp_Object prop, Lisp_Object object) { - return find_display_property (Fget_text_property (make_fixnum (bufpos), + return find_display_property (Fget_text_property (make_fixnum (charpos), Qdisplay, object), prop); } static void -display_min_width (struct it *it, ptrdiff_t bufpos, +display_min_width (struct it *it, ptrdiff_t charpos, Lisp_Object object, Lisp_Object width_spec) { + ptrdiff_t bufpos = CHARPOS (it->current.pos); + /* We're being called at the end of the `min-width' sequence, probably. */ if (!NILP (it->min_width_property) @@ -5658,9 +5660,9 @@ display_min_width (struct it *it, ptrdiff_t bufpos, get_display_property (0, Qmin_width, object))) /* In a buffer -- check that we're really right after the sequence of characters covered by this `min-width'. */ - || (bufpos > BEGV + || (bufpos > BEGV && charpos > 0 && EQ (it->min_width_property, - get_display_property (bufpos - 1, Qmin_width, object)))) + get_display_property (charpos - 1, Qmin_width, object)))) { Lisp_Object w = Qnil; double width; @@ -5713,9 +5715,9 @@ display_min_width (struct it *it, ptrdiff_t bufpos, && !EQ (it->min_width_property, get_display_property (0, Qmin_width, object))) /* Buffer. */ - || (bufpos > BEGV + || (bufpos > BEGV && charpos > 0 && !EQ (width_spec, - get_display_property (bufpos - 1, Qmin_width, object)))) + get_display_property (charpos - 1, Qmin_width, object)))) { it->min_width_property = width_spec; it->min_width_start = it->current_x; @@ -5795,10 +5797,10 @@ handle_display_prop (struct it *it) if (!STRINGP (it->string)) object = it->w->contents; - /* Handle min-width ends. */ + /* Handle min-width ends, except when processing an overlay. */ if (!NILP (it->min_width_property) && NILP (find_display_property (propval, Qmin_width))) - display_min_width (it, bufpos, object, Qnil); + display_min_width (it, CHARPOS (*position), object, Qnil); if (NILP (propval)) return HANDLED_NORMALLY; -- 2.25.1