EDAC: Fix some refcount leaks
Subsystems (2)
PATCH 1/1 EDAC: Fix some refcount leaks
kobject_init_and_add() takes reference even when it fails. According to the doc of kobject_init_and_add()
If this function returns an error, kobject_put() must be called to properly clean up the memory associated with the object.
Fix this by calling kobject_put() when kobject_init_and_add() fails.
--- drivers/edac/edac_device_sysfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/edac/edac_device_sysfs.c +2 -2
@@ -542,7 +542,7 @@ static int edac_device_create_block(struct edac_device_ctl_info *edac_dev,edac_dbg (1 ,"Failed to register instance '%s'\n" , block->name);kobject_put (main_kobj); err = -ENODEV ; - goto err_out; + goto err_on_attrib; }/* If there are driver level block attributes, then added them
@@ -640,7 +640,7 @@ static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev,edac_dbg (2 ,"Failed to register instance '%s'\n" , instance->name);kobject_put (main_kobj); - goto err_out; + goto edac_device_create_instance; } edac_dbg(4, "now register '%d' blocks for instance %d\n",
Signature · 1 line
2.25.1
kernel test robot
build botThank you for the patch! Yet something to improve:
Hi Miaoqian,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on ras/edac-for-next]
[also build test ERROR on linux/master linus/master v5.18-rc6 next-20220511] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Miaoqian-Lin/EDAC-Fix-some-refcount-leaks/20220511-161440 base: https://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next config: arm64-randconfig-r032-20220509 (https://download.01.org/0day-ci/archive/20220511/[email protected]/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 18dd123c56754edf62c7042dcf23185c3727610f)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/e5e3d8b94764dd1abe3c99881483c3f6dee8030a
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Miaoqian-Lin/EDAC-Fix-some-refcount-leaks/20220511-161440
git checkout e5e3d8b94764dd1abe3c99881483c3f6dee8030a
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/edac/
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
>> drivers/edac/edac_device_sysfs.c:640:8: error: use of undeclared label 'edac_device_create_instance'
goto edac_device_create_instance;
^1 error generated.
vim +/edac_device_create_instance +640 drivers/edac/edac_device_sysfs.c
604
605 /*
606 * edac_device_create_instance
607 * create just one instance of an edac_device 'instance'
608 */
609 static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev,
610 int idx)
611 {
612 int i, j;
613 int err;
614 struct edac_device_instance *instance;
615 struct kobject *main_kobj;
616
617 instance = &edac_dev->instances[idx];
618
619 /* Init the instance's kobject */
620 memset(&instance->kobj, 0, sizeof(struct kobject));
621
622 instance->ctl = edac_dev;
623
624 /* bump the main kobject's reference count for this controller
625 * and this instance is dependent on the main
626 */
627 main_kobj = kobject_get(&edac_dev->kobj);
628 if (!main_kobj) {
629 err = -ENODEV;
630 goto err_out;
631 }
632
633 /* Formally register this instance's kobject under the edac_device */
634 err = kobject_init_and_add(&instance->kobj, &ktype_instance_ctrl,
635 &edac_dev->kobj, "%s", instance->name);
636 if (err != 0) {
637 edac_dbg(2, "Failed to register instance '%s'\n",
638 instance->name);
639 kobject_put(main_kobj);
> 640 goto edac_device_create_instance;
641 }
642
643 edac_dbg(4, "now register '%d' blocks for instance %d\n",
644 instance->nr_blocks, idx);
645
646 /* register all blocks of this instance */
647 for (i = 0; i < instance->nr_blocks; i++) {
648 err = edac_device_create_block(edac_dev, instance,
649 &instance->blocks[i]);
650 if (err) {
651 /* If any fail, remove all previous ones */
652 for (j = 0; j < i; j++)
653 edac_device_delete_block(edac_dev,
654 &instance->blocks[j]);
655 goto err_release_instance_kobj;
656 }
657 }
658 kobject_uevent(&instance->kobj, KOBJ_ADD);
659
660 edac_dbg(4, "Registered instance %d '%s' kobject\n",
661 idx, instance->name);
662
663 return 0;
664
665 /* error unwind stack */
666 err_release_instance_kobj:
667 kobject_put(&instance->kobj);
668
669 err_out:
670 return err;
671 }
672
Signature · 2 lines
0-DAY CI Kernel Test Service https://01.org/lkp
kernel test robot
build botThank you for the patch! Yet something to improve:
Hi Miaoqian,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on ras/edac-for-next]
[also build test ERROR on linux/master linus/master v5.18-rc6 next-20220511] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/intel-lab-lkp/linux/commits/Miaoqian-Lin/EDAC-Fix-some-refcount-leaks/20220511-161440 base: https://git.kernel.org/pub/scm/linux/kernel/git/ras/ras.git edac-for-next config: powerpc-allyesconfig (https://download.01.org/0day-ci/archive/20220512/[email protected]/config) compiler: powerpc-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/e5e3d8b94764dd1abe3c99881483c3f6dee8030a
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Miaoqian-Lin/EDAC-Fix-some-refcount-leaks/20220511-161440
git checkout e5e3d8b94764dd1abe3c99881483c3f6dee8030a
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=powerpc SHELL=/bin/bash drivers/
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
drivers/edac/edac_device_sysfs.c: In function 'edac_device_create_instance':
>> drivers/edac/edac_device_sysfs.c:640:17: error: label 'edac_device_create_instance' used but not defined
640 | goto edac_device_create_instance;
| ^~~~vim +/edac_device_create_instance +640 drivers/edac/edac_device_sysfs.c
604
605 /*
606 * edac_device_create_instance
607 * create just one instance of an edac_device 'instance'
608 */
609 static int edac_device_create_instance(struct edac_device_ctl_info *edac_dev,
610 int idx)
611 {
612 int i, j;
613 int err;
614 struct edac_device_instance *instance;
615 struct kobject *main_kobj;
616
617 instance = &edac_dev->instances[idx];
618
619 /* Init the instance's kobject */
620 memset(&instance->kobj, 0, sizeof(struct kobject));
621
622 instance->ctl = edac_dev;
623
624 /* bump the main kobject's reference count for this controller
625 * and this instance is dependent on the main
626 */
627 main_kobj = kobject_get(&edac_dev->kobj);
628 if (!main_kobj) {
629 err = -ENODEV;
630 goto err_out;
631 }
632
633 /* Formally register this instance's kobject under the edac_device */
634 err = kobject_init_and_add(&instance->kobj, &ktype_instance_ctrl,
635 &edac_dev->kobj, "%s", instance->name);
636 if (err != 0) {
637 edac_dbg(2, "Failed to register instance '%s'\n",
638 instance->name);
639 kobject_put(main_kobj);
> 640 goto edac_device_create_instance;
641 }
642
643 edac_dbg(4, "now register '%d' blocks for instance %d\n",
644 instance->nr_blocks, idx);
645
646 /* register all blocks of this instance */
647 for (i = 0; i < instance->nr_blocks; i++) {
648 err = edac_device_create_block(edac_dev, instance,
649 &instance->blocks[i]);
650 if (err) {
651 /* If any fail, remove all previous ones */
652 for (j = 0; j < i; j++)
653 edac_device_delete_block(edac_dev,
654 &instance->blocks[j]);
655 goto err_release_instance_kobj;
656 }
657 }
658 kobject_uevent(&instance->kobj, KOBJ_ADD);
659
660 edac_dbg(4, "Registered instance %d '%s' kobject\n",
661 idx, instance->name);
662
663 return 0;
664
665 /* error unwind stack */
666 err_release_instance_kobj:
667 kobject_put(&instance->kobj);
668
669 err_out:
670 return err;
671 }
672
Signature · 2 lines
0-DAY CI Kernel Test Service https://01.org/lkp