Patch "RDMA/rtrs-srv: fix memory leak by missing kobject free" has been added to the 5.11-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    RDMA/rtrs-srv: fix memory leak by missing kobject free

to the 5.11-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rdma-rtrs-srv-fix-memory-leak-by-missing-kobject-fre.patch
and it can be found in the queue-5.11 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit cdd3071e4e22cd91243704fc38ebfbf1be2761e5
Author: Gioh Kim <gi-oh.kim@xxxxxxxxxxxxxxx>
Date:   Fri Feb 12 14:45:24 2021 +0100

    RDMA/rtrs-srv: fix memory leak by missing kobject free
    
    [ Upstream commit f7452a7e96c120d73100387d5f87de9fce7133cb ]
    
    kmemleak reported an error as below:
    
      unreferenced object 0xffff8880674b7640 (size 64):
        comm "kworker/4:1H", pid 113, jiffies 4296403507 (age 507.840s)
        hex dump (first 32 bytes):
          69 70 3a 31 39 32 2e 31 36 38 2e 31 32 32 2e 31  ip:192.168.122.1
          31 30 40 69 70 3a 31 39 32 2e 31 36 38 2e 31 32  10@ip:192.168.12
        backtrace:
          [<0000000054413611>] kstrdup+0x2e/0x60
          [<0000000078e3120a>] kobject_set_name_vargs+0x2f/0xb0
          [<00000000ca2be3ee>] kobject_init_and_add+0xb0/0x120
          [<0000000062ba5e78>] rtrs_srv_create_sess_files+0x14c/0x314 [rtrs_server]
          [<00000000b45b7217>] rtrs_srv_info_req_done+0x5b1/0x800 [rtrs_server]
          [<000000008fc5aa8f>] __ib_process_cq+0x94/0x100 [ib_core]
          [<00000000a9599cb4>] ib_cq_poll_work+0x32/0xc0 [ib_core]
          [<00000000cfc376be>] process_one_work+0x4bc/0x980
          [<0000000016e5c96a>] worker_thread+0x78/0x5c0
          [<00000000c20b8be0>] kthread+0x191/0x1e0
          [<000000006c9c0003>] ret_from_fork+0x3a/0x50
    
    It is caused by the not-freed kobject of rtrs_srv_sess.  The kobject
    embedded in rtrs_srv_sess has ref-counter 2 after calling
    process_info_req(). Therefore it must call kobject_put twice.  Currently
    it calls kobject_put only once at rtrs_srv_destroy_sess_files because
    kobject_del removes the state_in_sysfs flag and then kobject_put in
    free_sess() is not called.
    
    This patch moves kobject_del() into free_sess() so that the kobject of
    rtrs_srv_sess can be freed. And also this patch adds the missing call of
    sysfs_remove_group() to clean-up the sysfs directory.
    
    Fixes: 9cb837480424 ("RDMA/rtrs: server: main functionality")
    Link: https://lore.kernel.org/r/20210212134525.103456-4-jinpu.wang@xxxxxxxxxxxxxxx
    Signed-off-by: Gioh Kim <gi-oh.kim@xxxxxxxxxxxxxxx>
    Signed-off-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx>
    Signed-off-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
index 0a3886629cae8..94e3f3290500a 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
@@ -305,7 +305,7 @@ void rtrs_srv_destroy_sess_files(struct rtrs_srv_sess *sess)
 	if (sess->kobj.state_in_sysfs) {
 		kobject_del(&sess->stats->kobj_stats);
 		kobject_put(&sess->stats->kobj_stats);
-		kobject_del(&sess->kobj);
+		sysfs_remove_group(&sess->kobj, &rtrs_srv_sess_attr_group);
 		kobject_put(&sess->kobj);
 
 		rtrs_srv_destroy_once_sysfs_root_folders(sess);
diff --git a/drivers/infiniband/ulp/rtrs/rtrs-srv.c b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
index b6cb09972de55..77ec87f1a660b 100644
--- a/drivers/infiniband/ulp/rtrs/rtrs-srv.c
+++ b/drivers/infiniband/ulp/rtrs/rtrs-srv.c
@@ -1476,10 +1476,12 @@ static bool __is_path_w_addr_exists(struct rtrs_srv *srv,
 
 static void free_sess(struct rtrs_srv_sess *sess)
 {
-	if (sess->kobj.state_in_sysfs)
+	if (sess->kobj.state_in_sysfs) {
+		kobject_del(&sess->kobj);
 		kobject_put(&sess->kobj);
-	else
+	} else {
 		kfree(sess);
+	}
 }
 
 static void rtrs_srv_close_work(struct work_struct *work)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux