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,