OK deraadt
Ingo Schwarze <[email protected]> wrote:
> Hi,
>
> after quite some head-scratching, i consider the following bug report
> legitimate:
>
> user wrote on Thu, Aug 05, 2021 at 12:43:21AM -0500:
> > On Thu, Aug 05, 2021 at 12:37:00AM -0500, user wrote:
> >> On Fri, Jul 23, 2021 at 11:15:59AM -0500, user wrote:
>
> >>> Less contains a hack to force files of size 0 to become non-seekable
> >>> in order to workaround a linux kernel bug.
>
> I'm inserting a few words into the next sentence to make it clearer
> what it is trying to say:
>
> >>> When the file becomes non-seekable any further reads from the file
> >>> are appended
>
> to the temporary buffer in which less(1) holds the content
> of the file
>
> >>> rather than overwriting the original contents of the file
>
> in that buffer.
>
> >> Bug Reproduction:
>
> $ rm -rf /tmp/test
>
> >> $ touch /tmp/test
> >> $ less /tmp/test
> >> Press r
>
> > $ echo a > /tmp/test # my comment: from a different shell
> > Press h and q in less to reload the file
> > $ echo b > /tmp/test
> > Press h and q in less to reload the file
>
> Now less(1) shows the following on the screen because it thinks
> that would be the current content of the file:
>
> >> a
> >> b
>
> That is wrong. Instead, it should show the actual file content,
> which is just:
>
> b
>
> I think the proposed patch makes sense and should be committed:
> File size has nothing to do with whether a file is seekable,
> so i don't think it can cause regressions.
> Also, it fixes the bug described above.
>
> Any developer willing to provide an OK?
> Alternatively, commit yourself with OK schwarze@.
>
> I'm attaching the patch again because the OP mangled it (tabs
> replaced by spaces) and it did not apply.
>
> Yours,
> Ingo
>
>
> Index: ch.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/less/ch.c,v
> retrieving revision 1.21
> diff -u -p -r1.21 ch.c
> --- ch.c 3 Sep 2019 23:08:42 -0000 1.21
> +++ ch.c 6 Aug 2021 16:14:29 -0000
> @@ -643,19 +643,6 @@ ch_flush(void)
> ch_block = 0; /* ch_fpos / LBUFSIZE; */
> ch_offset = 0; /* ch_fpos % LBUFSIZE; */
>
> -#if 1
> - /*
> - * This is a kludge to workaround a Linux kernel bug: files in
> - * /proc have a size of 0 according to fstat() but have readable
> - * data. They are sometimes, but not always, seekable.
> - * Force them to be non-seekable here.
> - */
> - if (ch_fsize == 0) {
> - ch_fsize = -1;
> - ch_flags &= ~CH_CANSEEK;
> - }
> -#endif
> -
> if (lseek(ch_file, (off_t)0, SEEK_SET) == (off_t)-1) {
> /*
> * Warning only; even if the seek fails for some reason,
>