edd: fix possible memory leak in edd_init() error path
The error may happen at any iteration of the for loop, this patch properly unregisters already registed edd_devices in error path. [akpm@linux-foundation.org: remove unneeded NULL test] Signed-off-by: Axel Lin <axel.lin@gmail.com> Cc: Stephen Hemminger <shemminger@vyatta.com> Cc: Jens Axboe <jens.axboe@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
ea98eed9bc
commit
1986aaf828
|
@ -744,7 +744,7 @@ static inline int edd_num_devices(void)
|
||||||
static int __init
|
static int __init
|
||||||
edd_init(void)
|
edd_init(void)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
int i;
|
||||||
int rc=0;
|
int rc=0;
|
||||||
struct edd_device *edev;
|
struct edd_device *edev;
|
||||||
|
|
||||||
|
@ -760,20 +760,26 @@ edd_init(void)
|
||||||
if (!edd_kset)
|
if (!edd_kset)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < edd_num_devices() && !rc; i++) {
|
for (i = 0; i < edd_num_devices(); i++) {
|
||||||
edev = kzalloc(sizeof (*edev), GFP_KERNEL);
|
edev = kzalloc(sizeof (*edev), GFP_KERNEL);
|
||||||
if (!edev)
|
if (!edev) {
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
rc = edd_device_register(edev, i);
|
rc = edd_device_register(edev, i);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
kfree(edev);
|
kfree(edev);
|
||||||
break;
|
goto out;
|
||||||
}
|
}
|
||||||
edd_devices[i] = edev;
|
edd_devices[i] = edev;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc)
|
return 0;
|
||||||
|
|
||||||
|
out:
|
||||||
|
while (--i >= 0)
|
||||||
|
edd_device_unregister(edd_devices[i]);
|
||||||
kset_unregister(edd_kset);
|
kset_unregister(edd_kset);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue