| From dfb5394f804ed4fcea1fc925be275a38d66712ab Mon Sep 17 00:00:00 2001 |
| From: Kaike Wan <kaike.wan@intel.com> |
| Date: Thu, 26 Mar 2020 12:38:14 -0400 |
| Subject: IB/hfi1: Call kobject_put() when kobject_init_and_add() fails |
| |
| From: Kaike Wan <kaike.wan@intel.com> |
| |
| commit dfb5394f804ed4fcea1fc925be275a38d66712ab upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/infiniband/hw/hfi1/sysfs.c | 13 ++++++++----- |
| 1 file changed, 8 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/infiniband/hw/hfi1/sysfs.c |
| +++ b/drivers/infiniband/hw/hfi1/sysfs.c |
| @@ -670,7 +670,11 @@ int hfi1_create_port_files(struct ib_dev |
| 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); |
| |
| @@ -680,7 +684,7 @@ int hfi1_create_port_files(struct ib_dev |
| 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); |
| |
| @@ -690,7 +694,7 @@ int hfi1_create_port_files(struct ib_dev |
| 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); |
| |
| @@ -700,7 +704,7 @@ int hfi1_create_port_files(struct ib_dev |
| 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); |
| @@ -738,7 +742,6 @@ bail_sl2sc: |
| kobject_put(&ppd->sl2sc_kobj); |
| bail_sc2vl: |
| kobject_put(&ppd->sc2vl_kobj); |
| -bail: |
| return ret; |
| } |
| |