On Tue, 2024-10-08 at 13:30 +0200, Christian Brauner wrote:
Currently when passing a closed file descriptor to fcntl(fd, F_DUPFD_QUERY, fd_dup) the order matters:
fd = open("/dev/null"); fd_dup = dup(fd);
When we now close one of the file descriptors we get:
(1) fcntl(fd, fd_dup) // -EBADF (2) fcntl(fd_dup, fd) // 0 aka not equal
depending on which file descriptor is passed first. That's not a huge deal but it gives the api I slightly weird feel. Make it so that the order doesn't matter by requiring that both file descriptors are valid:
(1') fcntl(fd, fd_dup) // -EBADF (2') fcntl(fd_dup, fd) // -EBADF
Fixes: c62b758bae6a ("fcntl: add F_DUPFD_QUERY fcntl()") Cc: stable@vger.kernel.org Reported-by: Lennart Poettering lennart@poettering.net Signed-off-by: Christian Brauner brauner@kernel.org
fs/fcntl.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/fs/fcntl.c b/fs/fcntl.c index 22dd9dcce7ec..3d89de31066a 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -397,6 +397,9 @@ static long f_dupfd_query(int fd, struct file *filp) { CLASS(fd_raw, f)(fd);
- if (fd_empty(f))
return -EBADF;
- /*
- We can do the 'fdput()' immediately, as the only thing that
- matters is the pointer value which isn't changed by the fdput.
Consistency is good, so:
Reviewed-by: Jeff Layton jlayton@kernel.org
...that said, we should document that -EBADF means that at least one of the fd's is bogus, but this API doesn't tell you which ones those are. To figure that out, I guess you'd need to do something like issue F_GETFD against each and see which ones return -EBADF?