• Christian Brauner's avatar
    file: fix close_range() for unshare+cloexec · 9b5b8722
    Christian Brauner authored
    syzbot reported a bug when putting the last reference to a tasks file
    descriptor table. Debugging this showed we didn't recalculate the
    current maximum fd number for CLOSE_RANGE_UNSHARE | CLOSE_RANGE_CLOEXEC
    after we unshared the file descriptors table. So max_fd could exceed the
    current fdtable maximum causing us to set excessive bits. As a concrete
    example, let's say the user requested everything from fd 4 to ~0UL to be
    closed and their current fdtable size is 256 with their highest open fd
    being 4. With CLOSE_RANGE_UNSHARE the caller will end up with a new
    fdtable which has room for 64 file descriptors since that is the lowest
    fdtable size we accept. But now max_fd will still point to 255 and needs
    to be adjusted. Fix this by retrieving the correct maximum fd value in
    __range_cloexec().
    
    Reported-by: syzbot+283ce5a46486d6acdbaf@syzkaller.appspotmail.com
    Fixes: 582f1fb6 ("fs, close_range: add flag CLOSE_RANGE_CLOEXEC")
    Fixes: fec8a6a6 ("close_range: unshare all fds for CLOSE_RANGE_UNSHARE | CLOSE_RANGE_CLOEXEC")
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Giuseppe Scrivano <gscrivan@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: linux-fsdevel@vger.kernel.org
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
    9b5b8722
file.c 29.3 KB