Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Axel Lin and committed by
Linus Torvalds
1986aaf8 ea98eed9

+13 -7
+13 -7
drivers/firmware/edd.c
··· 744 744 static int __init 745 745 edd_init(void) 746 746 { 747 - unsigned int i; 747 + int i; 748 748 int rc=0; 749 749 struct edd_device *edev; 750 750 ··· 760 760 if (!edd_kset) 761 761 return -ENOMEM; 762 762 763 - for (i = 0; i < edd_num_devices() && !rc; i++) { 763 + for (i = 0; i < edd_num_devices(); i++) { 764 764 edev = kzalloc(sizeof (*edev), GFP_KERNEL); 765 - if (!edev) 766 - return -ENOMEM; 765 + if (!edev) { 766 + rc = -ENOMEM; 767 + goto out; 768 + } 767 769 768 770 rc = edd_device_register(edev, i); 769 771 if (rc) { 770 772 kfree(edev); 771 - break; 773 + goto out; 772 774 } 773 775 edd_devices[i] = edev; 774 776 } 775 777 776 - if (rc) 777 - kset_unregister(edd_kset); 778 + return 0; 779 + 780 + out: 781 + while (--i >= 0) 782 + edd_device_unregister(edd_devices[i]); 783 + kset_unregister(edd_kset); 778 784 return rc; 779 785 } 780 786