Commit 1986aaf8 authored by Axel Lin's avatar Axel Lin Committed by Linus Torvalds

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: default avatarAxel Lin <axel.lin@gmail.com>
Cc: Stephen Hemminger <shemminger@vyatta.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ea98eed9
...@@ -744,7 +744,7 @@ static inline int edd_num_devices(void) ...@@ -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,21 +760,27 @@ edd_init(void) ...@@ -760,21 +760,27 @@ 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;
kset_unregister(edd_kset);
out:
while (--i >= 0)
edd_device_unregister(edd_devices[i]);
kset_unregister(edd_kset);
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment