• Mauro Carvalho Chehab's avatar
    media: dvb_frontend: only use kref after initialized · ead66600
    Mauro Carvalho Chehab authored
    As reported by Laurent, when a DVB frontend need to register
    two drivers (e. g. a tuner and a demod), if the second driver
    fails to register (for example because it was not compiled),
    the error handling logic frees the frontend by calling
    dvb_frontend_detach(). That used to work fine, but changeset
    1f862a68 ("[media] dvb_frontend: move kref to struct dvb_frontend")
    added a kref at struct dvb_frontend. So, now, instead of just
    freeing the data, the error handling do a kref_put().
    
    That works fine only after dvb_register_frontend() succeeds.
    
    While it would be possible to add a helper function that
    would be initializing earlier the kref, that would require
    changing every single DVB frontend on non-trivial ways, and
    would make frontends different than other drivers.
    
    So, instead of doing that, let's focus on the real issue:
    only call kref_put() after kref_init(). That's easy to
    check, as, when the dvb frontend is successfuly registered,
    it will allocate its own private struct. So, if such
    struct is allocated, it means that it is safe to use
    kref_put(). If not, then nobody is using yet the frontend,
    and it is safe to just deallocate it.
    
    Fixes: 1f862a68 ("[media] dvb_frontend: move kref to struct dvb_frontend")
    Reported-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
    ead66600
dvb_frontend.c 75.3 KB