bug#81567: 31.0.90; overlay freeze

Romain Ouabdelkader <[email protected]>
Newsgroups gmane.emacs.bugs
Message-ID <CAJ8YToaS8TcvqnmWUHcy5zxJ5i++vrFLvp_d4UQm6pCM_vnrQw@mail.gmail.com>
Hello Eli,

Just to let you know, I have been using the patch for a few days now and
haven't seen any regressions.

On Fri, 7 Aug 2026 at 12:51, Romain Ouabdelkader <
[email protected]> wrote:

> Hello Eli,
>
> > Quite crazy, IMNSHO.
> I forgot to include that in my first email, disclaimer: I used LLM to
> quickly generate test cases to find a simple reproducer of the issue.
>
> I tried the patch, and I confirm that it fixed the issue.
> I don't see any regression right now, I will use it for a few days to see
> if I notice anything.
>
> Thank you!
>
> On Thu, 6 Aug 2026 at 18:29, Eli Zaretskii <[email protected]> wrote:
>
>> > From: Romain Ouabdelkader <[email protected]>
>> > Date: Thu, 6 Aug 2026 17:51:24 +0200
>> >
>> > The minimal reproducer I could get:
>> > - two line overlays with empty 'display
>> > - an overlay with 'before-string & 'display with multiple lines
>>
>> Quite crazy, IMNSHO.
>>
>> > When you scroll up to the beginning of the buffer, Emacs hangs. C-g does
>> > nothing, neither does kill -SIGUSR2.
>> >
>> > Attached is a minimal reproducer:
>> >
>> > 1. emacs -Q -l overlay-scroll-freeze.el -f overlay-scroll-freeze
>> > 2. hold C-p to move point to the start of the buffer
>> > 3. Emacs hangs when reaching the beginning of the buffer
>>
>> Thanks.
>>
>> (Actually, you must make sure you type C-p twice in quick succession
>> at BOB, otherwise there's no hang.)
>>
>> Please try the patch below and see if it solves the problem without
>> introducing regressions elsewhere.
>>
>> > I am pretty sure that the issue started on emacs31; although I didn't
>> > reinstall emacs30 to verify the reproducer.
>>
>> Emacs 30.2 indeed doesn't hang, but it produces garbled display in
>> this case.
>>
>> diff --git a/src/xdisp.c b/src/xdisp.c
>> index 5377d5e..b3227ce 100644
>> --- a/src/xdisp.c
>> +++ b/src/xdisp.c
>> @@ -11298,10 +11298,18 @@ move_it_vertically_backward (struct it *it, int
>> dy)
>>       y-distance.  */
>>    SAVE_IT (it2, *it, it2data);
>>    it2.max_ascent = it2.max_descent = 0;
>> +  ptrdiff_t to_pos = start_pos;
>>    do
>>      {
>> +      /* Avoid inflooping of there's a large display string with several
>> +         embedded newlines, which makes move_it_to stop after START_POS
>> +         but still inside a display or overlay string.  */
>> +      if (IT_CHARPOS (it2) >= start_pos)
>> +       to_pos = -1;
>>        move_it_to (&it2, start_pos, -1, -1, it2.vpos + 1,
>> -                 MOVE_TO_POS | MOVE_TO_VPOS);
>> +                 (to_pos > 0
>> +                   ? (MOVE_TO_POS | MOVE_TO_VPOS)
>> +                  : MOVE_TO_VPOS));
>>      }
>>    while (!(IT_POS_VALID_AFTER_MOVE_P (&it2)
>>            /* If we are in a display string which starts at START_POS,
>>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.