When fseek called, it in turn calls lseek (as expected), and then calls read() over the skipped range (as not expected). In the best case, it's a waste of CPU and IO resources. In the worst case, this causes an application that tried to skip too big range to just hang on fseek().
When fseek called, it in turn calls lseek (as expected), and then calls read() over the skipped range (as not expected). In the best case, it's a waste of CPU and IO resources. In the worst case, this causes an application that tried to skip too big range to just hang on fseek().
This is a follow up to discussion at https:/ /sourceware. org/ml/ libc-help/ 2020-01/ threads. html#00046
# Steps to reproduce (in terms of terminal commands)
$ cat test.c
#include <fcntl.h>
#include <stdio.h>
int main() { /tmp/test. c", "r");
perror( ""); 0x7fd2c36c1000, 4096, PROT_READ) = 0 0x7fd2c3628000, 451693) = 0 0x557c9e921000) = 0x557c9e921000 AT_FDCWD, "/tmp/test.c", O_RDONLY) = 3 S_IFREG| 0644, st_size=155, ...}) = 0
FILE* f = fopen("
if (!f)
fseek(f, 30, SEEK_SET);
}
$ gcc test.c -o a
$ strace ./a 2>&1 | tail
mprotect(
munmap(
brk(NULL) = 0x557c9e900000
brk(
openat(
fstat(3, {st_mode=
lseek(3, 0, SEEK_SET) = 0
read(3, "#include <fcntl.h>\n#include <s", 30) = 30
exit_group(0) = ?
+++ exited with
## Expected
There's no read() call after lseek()
## Actual
Both lseek() and read() are called.