Subject: Re: bug#55847: 29.0.50; line-number-at-pos ignores absolute parameter when checking position range

From: Po Lu <[email-masked]>
Date: Wed, 08 Jun 2022 20:52:18 +0800

Antoine Kalmbach <[email-masked]> writes:

> When working with a narrowed buffer, line-number-at-pos complains
> that the passed position parameter is out of range.
>
> I believe this occurs because in fns.c there is check as follows:
>
>    if (pos < BEGV || pos > ZV)
>
> This works just fine when the buffer isn't narrowed, but narrowing
> affects BEGV. Suppose the buffer is narrowed, and you want to get the
> line number for position x where x is before where the current narrowing
> begins, passing (line-number-at-pos x t) now reports an error

That's intentional behavior.  Very rarely is code allowed to access
buffer contents outside the accessible portion of the buffer, and
line-number-at-pos is not such a piece of code.

> because the correct thing to check is BEGV_BYTE, not BEGV.
> I think the change is as simple as checking pos < start, instead of pos
> < BEGV.
>
> The easiest way to reproduce is to make a buffer, narrow to a part of
> it, then evaluate (line-number-at-pos x t) where x is smaller than the
> absolute position of the narrowing, i.e. X < BEGV, but on the other hand
> x >= BEGV_BYTE.

BEGV_BYTE is the byte position of BEGV, but narrow-to-region and
line-number-at-pos operate on character positions, so comparing pos with
BEGV_BYTE doesn't make sense.  We don't want to allow code to access
buffer contents outside the accessible region, and besides, which lines
would they be on?  They are not visible, and there is no "starting
point" to calculate from.