Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

misc: fastrpc: avoid double fput() on failed usercopy

If the copy back to userland fails for the FASTRPC_IOCTL_ALLOC_DMA_BUFF
ioctl(), we shouldn't assume that 'buf->dmabuf' is still valid. In fact,
dma_buf_fd() called fd_install() before, i.e. "consumed" one reference,
leaving us with none.

Calling dma_buf_put() will therefore put a reference we no longer own,
leading to a valid file descritor table entry for an already released
'file' object which is a straight use-after-free.

Simply avoid calling dma_buf_put() and rely on the process exit code to
do the necessary cleanup, if needed, i.e. if the file descriptor is
still valid.

Fixes: 6cffd79504ce ("misc: fastrpc: Add support for dmabuf exporter")
Acked-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Mathias Krause <minipli@grsecurity.net>
Link: https://lore.kernel.org/r/20220127130218.809261-1-minipli@grsecurity.net
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Mathias Krause and committed by
Greg Kroah-Hartman
46963e2e 26291c54

+8 -1
+8 -1
drivers/misc/fastrpc.c
··· 1288 1288 } 1289 1289 1290 1290 if (copy_to_user(argp, &bp, sizeof(bp))) { 1291 - dma_buf_put(buf->dmabuf); 1291 + /* 1292 + * The usercopy failed, but we can't do much about it, as 1293 + * dma_buf_fd() already called fd_install() and made the 1294 + * file descriptor accessible for the current process. It 1295 + * might already be closed and dmabuf no longer valid when 1296 + * we reach this point. Therefore "leak" the fd and rely on 1297 + * the process exit path to do any required cleanup. 1298 + */ 1292 1299 return -EFAULT; 1293 1300 } 1294 1301