]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fcntl: make F_DUPFD_QUERY associative
authorChristian Brauner <brauner@kernel.org>
Tue, 8 Oct 2024 11:30:49 +0000 (13:30 +0200)
committerChristian Brauner <brauner@kernel.org>
Tue, 22 Oct 2024 09:16:58 +0000 (11:16 +0200)
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

Link: https://lore.kernel.org/r/20241008-duften-formel-251f967602d5@brauner
Fixes: c62b758bae6a ("fcntl: add F_DUPFD_QUERY fcntl()")
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Reviewed-By: Lennart Poettering <lennart@poettering.net>
Cc: stable@vger.kernel.org
Reported-by: Lennart Poettering <lennart@poettering.net>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fcntl.c

index 22dd9dcce7ecc8536afd9dd59b8aaf4644babb29..3d89de31066ae030ff3d4d3ca2cfe44e1c81539e 100644 (file)
@@ -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.