• Stefan Brüns's avatar
    media: dvbsky: Avoid leaking dvb frontend · 9bfc9c3a
    Stefan Brüns authored
    [ Upstream commit fdfa59cd ]
    
    Commit 14f4eaed ("media: dvbsky: fix driver unregister logic") fixed
    a use-after-free by removing the reference to the frontend after deleting
    the backing i2c device.
    
    This has the unfortunate side effect the frontend device is never freed
    in the dvb core leaving a dangling device, leading to errors when the
    dvb core tries to register the frontend after e.g. a replug as reported
    here: https://www.spinics.net/lists/linux-media/msg138181.html
    
    media: dvbsky: issues with DVBSky T680CI
    
    ===
    [  561.119145] sp2 8-0040: CIMaX SP2 successfully attached
    [  561.119161] usb 2-3: DVB: registering adapter 0 frontend 0 (Silicon Labs
    Si2168)...
    [  561.119174] sysfs: cannot create duplicate filename '/class/dvb/
    dvb0.frontend0'
    ===
    
    The use after free happened as dvb_usbv2_disconnect calls in this order:
    - dvb_usb_device::props->exit(...)
    - dvb_usbv2_adapter_frontend_exit(...)
      + if (fe) dvb_unregister_frontend(fe)
      + dvb_usb_device::props->frontend_detach(...)
    
    Moving the release of the i2c device from exit() to frontend_detach()
    avoids the dangling pointer access and allows the core to unregister
    the frontend.
    
    This was originally reported for a DVBSky T680CI, but it also affects
    the MyGica T230C. As all supported devices structure the registration/
    unregistration identically, apply the change for all device types.
    Signed-off-by: default avatarStefan Brüns <stefan.bruens@rwth-aachen.de>
    Signed-off-by: default avatarSean Young <sean@mess.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    9bfc9c3a
dvbsky.c 21.3 KB