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,

Reply via email to