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

EDAC: Fix the leak of mci->bus->name when bus_register fails

Also use goto labels for all failure paths in
edac_create_sysfs_mci_device and update meaningless labels.

Signed-off-by: Junjie Mao <junjie.mao@hotmail.com>
Link: http://lkml.kernel.org/r/BLU436-SMTP25291B6B612942A212AEBFE95300@phx.gbl
[ Boris: Use ! for 0 checks and add newlines for less crammed code. ]
Signed-off-by: Borislav Petkov <bp@suse.de>

authored by

Junjie Mao and committed by
Borislav Petkov
1bf1950c a4972b1b

+16 -13
+16 -13
drivers/edac/edac_mc_sysfs.c
··· 989 989 990 990 err = bus_register(mci->bus); 991 991 if (err < 0) 992 - return err; 992 + goto fail_free_name; 993 993 994 994 /* get the /sys/devices/system/edac subsys reference */ 995 995 mci->dev.type = &mci_attr_type; ··· 1005 1005 err = device_add(&mci->dev); 1006 1006 if (err < 0) { 1007 1007 edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); 1008 - bus_unregister(mci->bus); 1009 - kfree(mci->bus->name); 1010 - return err; 1008 + goto fail_unregister_bus; 1011 1009 } 1012 1010 1013 1011 if (mci->set_sdram_scrub_rate || mci->get_sdram_scrub_rate) { ··· 1013 1015 dev_attr_sdram_scrub_rate.attr.mode |= S_IRUGO; 1014 1016 dev_attr_sdram_scrub_rate.show = &mci_sdram_scrub_rate_show; 1015 1017 } 1018 + 1016 1019 if (mci->set_sdram_scrub_rate) { 1017 1020 dev_attr_sdram_scrub_rate.attr.mode |= S_IWUSR; 1018 1021 dev_attr_sdram_scrub_rate.store = &mci_sdram_scrub_rate_store; 1019 1022 } 1020 - err = device_create_file(&mci->dev, 1021 - &dev_attr_sdram_scrub_rate); 1023 + 1024 + err = device_create_file(&mci->dev, &dev_attr_sdram_scrub_rate); 1022 1025 if (err) { 1023 1026 edac_dbg(1, "failure: create sdram_scrub_rate\n"); 1024 - goto fail2; 1027 + goto fail_unregister_dev; 1025 1028 } 1026 1029 } 1027 1030 /* ··· 1031 1032 for (i = 0; i < mci->tot_dimms; i++) { 1032 1033 struct dimm_info *dimm = mci->dimms[i]; 1033 1034 /* Only expose populated DIMMs */ 1034 - if (dimm->nr_pages == 0) 1035 + if (!dimm->nr_pages) 1035 1036 continue; 1037 + 1036 1038 #ifdef CONFIG_EDAC_DEBUG 1037 1039 edac_dbg(1, "creating dimm%d, located at ", i); 1038 1040 if (edac_debug_level >= 1) { ··· 1048 1048 err = edac_create_dimm_object(mci, dimm, i); 1049 1049 if (err) { 1050 1050 edac_dbg(1, "failure: create dimm %d obj\n", i); 1051 - goto fail; 1051 + goto fail_unregister_dimm; 1052 1052 } 1053 1053 } 1054 1054 1055 1055 #ifdef CONFIG_EDAC_LEGACY_SYSFS 1056 1056 err = edac_create_csrow_objects(mci); 1057 1057 if (err < 0) 1058 - goto fail; 1058 + goto fail_unregister_dimm; 1059 1059 #endif 1060 1060 1061 1061 #ifdef CONFIG_EDAC_DEBUG ··· 1063 1063 #endif 1064 1064 return 0; 1065 1065 1066 - fail: 1066 + fail_unregister_dimm: 1067 1067 for (i--; i >= 0; i--) { 1068 1068 struct dimm_info *dimm = mci->dimms[i]; 1069 - if (dimm->nr_pages == 0) 1069 + if (!dimm->nr_pages) 1070 1070 continue; 1071 + 1071 1072 device_unregister(&dimm->dev); 1072 1073 } 1073 - fail2: 1074 + fail_unregister_dev: 1074 1075 device_unregister(&mci->dev); 1076 + fail_unregister_bus: 1075 1077 bus_unregister(mci->bus); 1078 + fail_free_name: 1076 1079 kfree(mci->bus->name); 1077 1080 return err; 1078 1081 }