svn commit: r291481 - head/sys/compat/linuxkpi/common/include/linux
Hans Petter Selasky
hps at selasky.org
Wed Dec 2 20:45:58 UTC 2015
On 12/02/15 21:29, Mateusz Guzik wrote:
> On Mon, Nov 30, 2015 at 09:24:12AM +0000, Hans Petter Selasky wrote:
>> Author: hselasky
>> Date: Mon Nov 30 09:24:12 2015
>> New Revision: 291481
>> URL: https://svnweb.freebsd.org/changeset/base/291481
>>
>> Log:
>> Add more functions and types to the LinuxKPI.
>>
>> MFC after: 1 week
>> Sponsored by: Mellanox Technologies
>>
>> Modified:
>> head/sys/compat/linuxkpi/common/include/linux/file.h
>> head/sys/compat/linuxkpi/common/include/linux/workqueue.h
>>
>> Modified: head/sys/compat/linuxkpi/common/include/linux/file.h
>> ==============================================================================
>> --- head/sys/compat/linuxkpi/common/include/linux/file.h Mon Nov 30 09:13:04 2015 (r291480)
>> +++ head/sys/compat/linuxkpi/common/include/linux/file.h Mon Nov 30 09:24:12 2015 (r291481)
>> @@ -2,7 +2,7 @@
>> * Copyright (c) 2010 Isilon Systems, Inc.
>> * Copyright (c) 2010 iX Systems, Inc.
>> * Copyright (c) 2010 Panasas, Inc.
>> - * Copyright (c) 2013 Mellanox Technologies, Ltd.
>> + * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
>> * All rights reserved.
>> *
>> * Redistribution and use in source and binary forms, with or without
>> @@ -125,6 +125,21 @@ get_unused_fd(void)
>> return fd;
>> }
>>
>> +static inline int
>> +get_unused_fd_flags(int flags)
>> +{
>> + struct file *file;
>> + int error;
>> + int fd;
>> +
>> + error = falloc(curthread, &file, &fd, flags);
>> + if (error)
>> + return -error;
>> + /* drop the extra reference */
>> + fdrop(file, curthread);
>> + return fd;
>> +}
>> +
>
> This does not look right.
>
> AFAIR Linux drivers are not going to install fds into kernel threads. So
> this would be used for a userspace thread, but then it would completely
> insecure.
>
> Linux model is to reserve a slot in the fd table, obtain a 'file' object
> and install it as the last step.
>
> FreeBSD installs the file right away, but this means an extra reference
> has to be held in case something else using the table closes the fd.
>
> As such, this fdrop can lead to a use-after-free as the file can be
> freed from this poin.
>
> I'm afraid there is no way around patching improted consumers.
>
Hi Mateusz,
Thanks for your input. Yes, there is a potential race there, but no
use-after-free from what I can see, because the LinuxKPI always retrieve
the file pointer by the file number using "fget_unlocked()".
I'll look into if we can delay the fdrop() until after the fd_install().
--HPS
More information about the svn-src-head
mailing list