| From b412d7482e123ee467c8c36ede557db8b132199d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 28 May 2021 13:30:18 +0200 |
| Subject: RDMA/rtrs-clt: Fix memory leak of not-freed sess->stats and |
| stats->pcpu_stats |
| |
| From: Gioh Kim <gi-oh.kim@cloud.ionos.com> |
| |
| [ Upstream commit 7ecd7e290bee0ab9cf75b79a367a4cc113cf8292 ] |
| |
| sess->stats and sess->stats->pcpu_stats objects are freed |
| when sysfs entry is removed. If something wrong happens and |
| session is closed before sysfs entry is created, |
| sess->stats and sess->stats->pcpu_stats objects are not freed. |
| |
| This patch adds freeing of them at three places: |
| 1. When client uses wrong address and session creation fails. |
| 2. When client fails to create a sysfs entry. |
| 3. When client adds wrong address via sysfs add_path. |
| |
| Fixes: 215378b838df0 ("RDMA/rtrs: client: sysfs interface functions") |
| Link: https://lore.kernel.org/r/20210528113018.52290-21-jinpu.wang@ionos.com |
| Signed-off-by: Gioh Kim <gi-oh.kim@ionos.com> |
| Signed-off-by: Jack Wang <jinpu.wang@ionos.com> |
| Signed-off-by: Jason Gunthorpe <jgg@nvidia.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/infiniband/ulp/rtrs/rtrs-clt.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| diff --git a/drivers/infiniband/ulp/rtrs/rtrs-clt.c b/drivers/infiniband/ulp/rtrs/rtrs-clt.c |
| index dc44a9bfcdaa..46fad202a380 100644 |
| --- a/drivers/infiniband/ulp/rtrs/rtrs-clt.c |
| +++ b/drivers/infiniband/ulp/rtrs/rtrs-clt.c |
| @@ -2706,6 +2706,8 @@ struct rtrs_clt *rtrs_clt_open(struct rtrs_clt_ops *ops, |
| if (err) { |
| list_del_rcu(&sess->s.entry); |
| rtrs_clt_close_conns(sess, true); |
| + free_percpu(sess->stats->pcpu_stats); |
| + kfree(sess->stats); |
| free_sess(sess); |
| goto close_all_sess; |
| } |
| @@ -2714,6 +2716,8 @@ struct rtrs_clt *rtrs_clt_open(struct rtrs_clt_ops *ops, |
| if (err) { |
| list_del_rcu(&sess->s.entry); |
| rtrs_clt_close_conns(sess, true); |
| + free_percpu(sess->stats->pcpu_stats); |
| + kfree(sess->stats); |
| free_sess(sess); |
| goto close_all_sess; |
| } |
| @@ -2973,6 +2977,8 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt *clt, |
| close_sess: |
| rtrs_clt_remove_path_from_arr(sess); |
| rtrs_clt_close_conns(sess, true); |
| + free_percpu(sess->stats->pcpu_stats); |
| + kfree(sess->stats); |
| free_sess(sess); |
| |
| return err; |
| -- |
| 2.30.2 |
| |