| From 4c5e354a974214dfb44cd23fa0429327693bc3ea Mon Sep 17 00:00:00 2001 |
| From: Tilman Schmidt <tilman@imap.cc> |
| Date: Tue, 15 Dec 2015 18:11:30 +0100 |
| Subject: 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> |
| --- |
| drivers/isdn/gigaset/ser-gigaset.c | 10 +++++++--- |
| 1 file changed, 7 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/isdn/gigaset/ser-gigaset.c |
| +++ b/drivers/isdn/gigaset/ser-gigaset.c |
| @@ -371,19 +371,23 @@ static void gigaset_freecshw(struct card |
| 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; |
| } |
| |
| /* |