dect
/
linux-2.6
Archived
13
0
Fork 0

EDAC: Cleanup device deregistering path

Use device_unregister to replace put_device + device_del for
cleanup, and fix the potential use after free.

Signed-off-by: Lans Zhang <jia.zhang@windriver.com>
Signed-off-by: Borislav Petkov <bp@alien8.de>
This commit is contained in:
Lans Zhang 2012-12-24 14:01:34 +01:00 committed by Borislav Petkov
parent 5445166384
commit 44d22e2404
1 changed files with 6 additions and 12 deletions

View File

@ -472,8 +472,7 @@ static void edac_delete_csrow_objects(struct mem_ctl_info *mci)
device_remove_file(&csrow->dev, device_remove_file(&csrow->dev,
dynamic_csrow_ce_count_attr[chan]); dynamic_csrow_ce_count_attr[chan]);
} }
put_device(&mci->csrows[i]->dev); device_unregister(&mci->csrows[i]->dev);
device_del(&mci->csrows[i]->dev);
} }
} }
#endif #endif
@ -1055,11 +1054,9 @@ fail:
struct dimm_info *dimm = mci->dimms[i]; struct dimm_info *dimm = mci->dimms[i];
if (dimm->nr_pages == 0) if (dimm->nr_pages == 0)
continue; continue;
put_device(&dimm->dev); device_unregister(&dimm->dev);
device_del(&dimm->dev);
} }
put_device(&mci->dev); device_unregister(&mci->dev);
device_del(&mci->dev);
bus_unregister(&mci->bus); bus_unregister(&mci->bus);
kfree(mci->bus.name); kfree(mci->bus.name);
return err; return err;
@ -1086,16 +1083,14 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci)
if (dimm->nr_pages == 0) if (dimm->nr_pages == 0)
continue; continue;
edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev));
put_device(&dimm->dev); device_unregister(&dimm->dev);
device_del(&dimm->dev);
} }
} }
void edac_unregister_sysfs(struct mem_ctl_info *mci) void edac_unregister_sysfs(struct mem_ctl_info *mci)
{ {
edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev));
put_device(&mci->dev); device_unregister(&mci->dev);
device_del(&mci->dev);
bus_unregister(&mci->bus); bus_unregister(&mci->bus);
kfree(mci->bus.name); kfree(mci->bus.name);
} }
@ -1159,7 +1154,6 @@ int __init edac_mc_sysfs_init(void)
void __exit edac_mc_sysfs_exit(void) void __exit edac_mc_sysfs_exit(void)
{ {
device_del(mci_pdev); device_unregister(mci_pdev);
put_device(mci_pdev);
edac_put_sysfs_subsys(); edac_put_sysfs_subsys();
} }