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,