• Mathias Krause's avatar
    iio: buffer: Fix file related error handling in IIO_BUFFER_GET_FD_IOCTL · c72ea205
    Mathias Krause authored
    If we fail to copy the just created file descriptor to userland, we
    try to clean up by putting back 'fd' and freeing 'ib'. The code uses
    put_unused_fd() for the former which is wrong, as the file descriptor
    was already published by fd_install() which gets called internally by
    anon_inode_getfd().
    
    This makes the error handling code leaving a half cleaned up file
    descriptor table around and a partially destructed 'file' object,
    allowing userland to play use-after-free tricks on us, by abusing
    the still usable fd and making the code operate on a dangling
    'file->private_data' pointer.
    
    Instead of leaving the kernel in a partially corrupted state, don't
    attempt to explicitly clean up and leave this to the process exit
    path that'll release any still valid fds, including the one created
    by the previous call to anon_inode_getfd(). Simply return -EFAULT to
    indicate the error.
    
    Fixes: f73f7f4d ("iio: buffer: add ioctl() to support opening extra buffers for IIO device")
    Cc: stable@kernel.org
    Cc: Jonathan Cameron <jic23@kernel.org>
    Cc: Alexandru Ardelean <ardeleanalex@gmail.com>
    Cc: Lars-Peter Clausen <lars@metafoo.de>
    Cc: Nuno Sa <Nuno.Sa@analog.com>
    Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: default avatarMathias Krause <minipli@grsecurity.net>
    Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c72ea205
industrialio-buffer.c 50.6 KB