IB/hfi1: Call kobject_put() when kobject_init_and_add() fails
authorKaike Wan <kaike.wan@intel.com>
Thu, 26 Mar 2020 16:38:14 +0000 (12:38 -0400)
committerJason Gunthorpe <jgg@mellanox.com>
Fri, 27 Mar 2020 16:13:36 +0000 (13:13 -0300)
When kobject_init_and_add() returns an error in the function
hfi1_create_port_files(), the function kobject_put() is not called for the
corresponding kobject, which potentially leads to memory leak.

This patch fixes the issue by calling kobject_put() even if
kobject_init_and_add() fails.

Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20200326163813.21129.44280.stgit@awfm-01.aw.intel.com
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hfi1/sysfs.c

index f1bcecf925352665e5f9f5006a061a2b0f9c9f12..074ec71772d2a514e97f13f09df2c837c47bbbee 100644 (file)
@@ -674,7 +674,11 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
                dd_dev_err(dd,
                           "Skipping sc2vl sysfs info, (err %d) port %u\n",
                           ret, port_num);
-               goto bail;
+               /*
+                * Based on the documentation for kobject_init_and_add(), the
+                * caller should call kobject_put even if this call fails.
+                */
+               goto bail_sc2vl;
        }
        kobject_uevent(&ppd->sc2vl_kobj, KOBJ_ADD);
 
@@ -684,7 +688,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
                dd_dev_err(dd,
                           "Skipping sl2sc sysfs info, (err %d) port %u\n",
                           ret, port_num);
-               goto bail_sc2vl;
+               goto bail_sl2sc;
        }
        kobject_uevent(&ppd->sl2sc_kobj, KOBJ_ADD);
 
@@ -694,7 +698,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
                dd_dev_err(dd,
                           "Skipping vl2mtu sysfs info, (err %d) port %u\n",
                           ret, port_num);
-               goto bail_sl2sc;
+               goto bail_vl2mtu;
        }
        kobject_uevent(&ppd->vl2mtu_kobj, KOBJ_ADD);
 
@@ -704,7 +708,7 @@ int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
                dd_dev_err(dd,
                           "Skipping Congestion Control sysfs info, (err %d) port %u\n",
                           ret, port_num);
-               goto bail_vl2mtu;
+               goto bail_cc;
        }
 
        kobject_uevent(&ppd->pport_cc_kobj, KOBJ_ADD);
@@ -742,7 +746,6 @@ bail_sl2sc:
        kobject_put(&ppd->sl2sc_kobj);
 bail_sc2vl:
        kobject_put(&ppd->sc2vl_kobj);
-bail:
        return ret;
 }