diff options
author | Tilman Schmidt <tilman@imap.cc> | 2015-12-15 18:11:30 +0100 |
---|---|---|
committer | Zefan Li <lizefan@huawei.com> | 2016-10-26 23:15:38 +0800 |
commit | 325c0423cb71364f51ac9d6f33739378ee19001b (patch) | |
tree | 0f93f03c82843269ecbba5e9856fe849b7842a52 | |
parent | eeeeb9763a6d52eb1ccaf92fa7d8ff347957a57d (diff) | |
download | linux-rt-325c0423cb71364f51ac9d6f33739378ee19001b.tar.gz |
ser_gigaset: fix deallocation of platform device structure
commit 4c5e354a974214dfb44cd23fa0429327693bc3ea upstream.
When shutting down the device, the struct ser_cardstate must not be
kfree()d immediately after the call to platform_device_unregister()
since the embedded struct platform_device is still in use.
Move the kfree() call to the release method instead.
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Fixes: 2869b23e4b95 ("drivers/isdn/gigaset: new M101 driver (v2)")
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Paul Bolle <pebolle@tiscali.nl>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Zefan Li <lizefan@huawei.com>
-rw-r--r-- | drivers/isdn/gigaset/ser-gigaset.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c index 6f3fd4cf4378..3cdfcd0019a1 100644 --- a/drivers/isdn/gigaset/ser-gigaset.c +++ b/drivers/isdn/gigaset/ser-gigaset.c @@ -371,19 +371,23 @@ static void gigaset_freecshw(struct cardstate *cs) tasklet_kill(&cs->write_tasklet); if (!cs->hw.ser) return; - dev_set_drvdata(&cs->hw.ser->dev.dev, NULL); platform_device_unregister(&cs->hw.ser->dev); - kfree(cs->hw.ser); - cs->hw.ser = NULL; } static void gigaset_device_release(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); + struct cardstate *cs = dev_get_drvdata(dev); /* adapted from platform_device_release() in drivers/base/platform.c */ kfree(dev->platform_data); kfree(pdev->resource); + + if (!cs) + return; + dev_set_drvdata(dev, NULL); + kfree(cs->hw.ser); + cs->hw.ser = NULL; } /* |