Re: [PATCH] misc: fastrpc: avoid double fput() on failed usercopy

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 27.01.22 um 14:24 schrieb Greg Kroah-Hartman:
> On Thu, Jan 27, 2022 at 02:02:18PM +0100, Mathias Krause wrote:
>> 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")
>> Signed-off-by: Mathias Krause <minipli@xxxxxxxxxxxxxx>
>> ---
>>  drivers/misc/fastrpc.c | 9 ++++++++-
>>  1 file changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
>> index 4ccbf43e6bfa..aa1682b94a23 100644
>> --- a/drivers/misc/fastrpc.c
>> +++ b/drivers/misc/fastrpc.c
>> @@ -1288,7 +1288,14 @@ static int fastrpc_dmabuf_alloc(struct fastrpc_user *fl, char __user *argp)
>>  	}
>>  
>>  	if (copy_to_user(argp, &bp, sizeof(bp))) {
>> -		dma_buf_put(buf->dmabuf);
>> +		/*
>> +		 * The usercopy failed, but we can't do much about it, as
>> +		 * dma_buf_fd() already called fd_install() and made the
>> +		 * file descriptor accessible for the current process. It
>> +		 * might already be closed and dmabuf no longer valid when
>> +		 * we reach this point. Therefore "leak" the fd and rely on
>> +		 * the process exit path to do any required cleanup.
>> +		 */
>>  		return -EFAULT;
>>  	}
>>  
> 
> This feels wrong.  How do all other dma buf users handle this?

Other dma_buf_fd() users don't wrap the returned fd in another structure
and simply return the fd, i.e. have no error path on the way out of the
kernel.

Thanks,
Mathias

> And you forgot to cc: the dmabuf developers, I think get_maintainers.pl
> should have caught them on this patch.
> 
> thanks,
> 
> greg k-h



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux