• Paul Bolle's avatar
    ser_gigaset: use container_of() instead of detour · 8d2c3ab4
    Paul Bolle authored
    The purpose of gigaset_device_release() is to kfree() the struct
    ser_cardstate that contains our struct device. This is done via a bit of
    a detour. First we make our struct device's driver_data point to the
    container of our struct ser_cardstate (which is a struct cardstate). In
    gigaset_device_release() we then retrieve that driver_data again. And
    after that we finally kfree() the struct ser_cardstate that was saved in
    the struct cardstate.
    
    All of this can be achieved much easier by using container_of() to get
    from our struct device to its container, struct ser_cardstate. Do so.
    
    Note that at the time the detour was implemented commit b8b2c7d8
    ("base/platform: assert that dev_pm_domain callbacks are called
    unconditionally") had just entered the tree. That commit disconnected
    our platform_device and our platform_driver. These were reconnected
    again in v4.5-rc2 through commit 25cad69f ("base/platform: Fix
    platform drivers with no probe callback"). And one of the consequences
    of that fix was that it broke the detour via driver_data. That's because
    it made __device_release_driver() stop being a NOP for our struct device
    and actually do stuff again. One of the things it now does, is setting
    our driver_data to NULL. That, in turn, makes it impossible for
    gigaset_device_release() to get to our struct cardstate. Which has the
    net effect of leaking a struct ser_cardstate at every call of this
    driver's tty close() operation. So using container_of() has the
    additional benefit of actually working.
    Reported-by: default avatarDmitry Vyukov <dvyukov@google.com>
    Tested-by: default avatarDmitry Vyukov <dvyukov@google.com>
    Signed-off-by: default avatarPaul Bolle <pebolle@tiscali.nl>
    Acked-by: default avatarTilman Schmidt <tilman@imap.cc>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    8d2c3ab4
ser-gigaset.c 18.1 KB