[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <bug-200043-13602@https.bugzilla.kernel.org/>
Date: Tue, 12 Jun 2018 13:10:15 +0000
From: bugzilla-daemon@...zilla.kernel.org
To: linux-ext4@...nel.org
Subject: [Bug 200043] New: lseek returns negative and inconsistent positions
for directories on ext4 fs
https://bugzilla.kernel.org/show_bug.cgi?id=200043
Bug ID: 200043
Summary: lseek returns negative and inconsistent positions for
directories on ext4 fs
Product: File System
Version: 2.5
Kernel Version: v4.17
Hardware: All
OS: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: ext4
Assignee: fs_ext4@...nel-bugs.osdl.org
Reporter: anatoly.trosinenko@...il.com
Regression: No
When used on a directory FD residing on Ext4 FS, lseek with SEEK_END (and maybe
other whence-s) can return negative numbers and leave errno = 0. These numbers
in case of SEEK_END are (-1 - offset) and do not accumulate.
Reading the lseek(2) man page, I'm not absolutely sure it is a bug, but this
seems to be quite strange behavior.
How to reproduce:
1. Compile the following code:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
int fd = open(argv[1], O_RDONLY);
printf("fd = %d\n", fd);
int res = lseek(fd, -10, SEEK_END);
printf("lseek returned: %d (errno = %d)\n", res, errno);
res = lseek(fd, -1, SEEK_END);
printf("lseek returned: %d (errno = %d)\n", res, errno);
res = lseek(fd, 0, SEEK_END);
printf("lseek returned: %d (errno = %d)\n", res, errno);
res = lseek(fd, -11, SEEK_SET);
printf("lseek returned: %d (errno = %d)\n", res, errno);
return 0;
}
2. Run it:
# ./lseek_negative /tmp # Suppose the tmpfs is mounted there
fd = 3
lseek returned -1 (errno = 22)
lseek returned -1 (errno = 22)
lseek returned -1 (errno = 22)
lseek returned -1 (errno = 22)
# ./lseek_negative / # Suppose the / is ext4
fd = 3
lseek returned -11 (errno = 0)
lseek returned -2 (errno = 0)
lseek returned -1 (errno = 0) <-- Look at the errno value
lseek returned -1 (errno = 22)
--
You are receiving this mail because:
You are watching the assignee of the bug.
Powered by blists - more mailing lists