Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -744,7 +744,7 @@ static inline int edd_num_devices(void)
static int __init
edd_init(void)
{
	unsigned int i;
	int i;
	int rc=0;
	struct edd_device *edev;

@@ -760,20 +760,26 @@ edd_init(void)
	if (!edd_kset)
		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);
		if (!edev)
			return -ENOMEM;
		if (!edev) {
			rc = -ENOMEM;
			goto out;
		}

		rc = edd_device_register(edev, i);
		if (rc) {
			kfree(edev);
			break;
			goto out;
		}
		edd_devices[i] = edev;
	}

	if (rc)
	return 0;

out:
	while (--i >= 0)
		edd_device_unregister(edd_devices[i]);
	kset_unregister(edd_kset);
	return rc;
}