svn commit: r303870 - head/sys/dev/mlx5/mlx5_en
Hans Petter Selasky
hps at selasky.org
Wed Aug 10 09:15:25 UTC 2016
On 08/09/16 19:25, John Baldwin wrote:
> On Tuesday, August 09, 2016 07:43:15 AM Hans Petter Selasky wrote:
>> Author: hselasky
>> Date: Tue Aug 9 07:43:15 2016
>> New Revision: 303870
>> URL: https://svnweb.freebsd.org/changeset/base/303870
>>
>> Log:
>> Fix for use after free.
>>
>> Clear the device description to avoid use after free because the
>> bsddev is not destroyed when the mlx5en module is unloaded. Only when
>> the parent mlx5 module is unloaded the bsddev is destroyed. This fixes
>> a panic on listing sysctls which refer strings in the bsddev after the
>> mlx5en module has been unloaded.
>>
>> Sponsored by: Mellanox Technologies
>> MFC after: 1 week
>
> Hmmm, this seems like it is working around a bug somewhere else.
> device_detach() calls device_set_driver(dev, NULL) which in turn calls
> device_set_desc(dev, NULL) which should be clearing the description. You can
> only be leaking a desc pointer if you aren't detaching the device. Not
> detaching a device but unloading the module containing part (but apparently
> not all) of its driver would seem to be fraught with peril. Why are you not
> detaching the mlx5en0 device when unloading this module?
>
Hi John,
It is not a bug in the kernel.
When mlx5en is unloaded, device_detach() is not called, and that is
expected. The mlx5 and mlx4 family of drivers have their own one-level
bus subsystem. mlx5.ko will call LINUXKPI's pci_register_driver() and
then probe mlx5en internally. When mlx5en is detached, mlx5 will detach
the mlx5en driver, but it will not call "pci_unregister_driver()" which
calls the device_detach(). This will only happen when the mlx5.ko is
unloaded. Because the mlx5, mlx5en and mlx5ib (coming) modules are
separated we can end up in this situation.
I hope you understand and that my explanation was not too complicated.
For other in-kernel drivers, this is not a problem. Like you write
device_detach() will take care of device_set_driver(dev, NULL) and that
will clear the device description.
--HPS
More information about the svn-src-head
mailing list