| From eaa3128cfbc41f564b958d6063a3fde266e50ed3 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 24 Feb 2021 12:00:41 -0800 |
| Subject: ocfs2: fix a use after free on error |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| [ Upstream commit c57d117f2b2f2a19b570c36f2819ef8d8210af20 ] |
| |
| The error handling in this function frees "reg" but it is still on the |
| "o2hb_all_regions" list so it will lead to a use after freew. Joseph Qi |
| points out that we need to clear the bit in the "o2hb_region_bitmap" as |
| well |
| |
| Link: https://lkml.kernel.org/r/YBk4M6HUG8jB/jc7@mwanda |
| Fixes: 1cf257f51191 ("ocfs2: fix memory leak") |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Reviewed-by: Joseph Qi <joseph.qi@linux.alibaba.com> |
| Cc: Mark Fasheh <mark@fasheh.com> |
| Cc: Joel Becker <jlbec@evilplan.org> |
| Cc: Junxiao Bi <junxiao.bi@oracle.com> |
| Cc: Changwei Ge <gechangwei@live.cn> |
| Cc: Gang He <ghe@suse.com> |
| Cc: Jun Piao <piaojun@huawei.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/ocfs2/cluster/heartbeat.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c |
| index 5e8709aa1e7ec..89c71d32dc05b 100644 |
| --- a/fs/ocfs2/cluster/heartbeat.c |
| +++ b/fs/ocfs2/cluster/heartbeat.c |
| @@ -2155,7 +2155,7 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g |
| o2hb_nego_timeout_handler, |
| reg, NULL, ®->hr_handler_list); |
| if (ret) |
| - goto free; |
| + goto remove_item; |
| |
| ret = o2net_register_handler(O2HB_NEGO_APPROVE_MSG, reg->hr_key, |
| sizeof(struct o2hb_nego_msg), |
| @@ -2174,6 +2174,12 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g |
| |
| unregister_handler: |
| o2net_unregister_handler_list(®->hr_handler_list); |
| +remove_item: |
| + spin_lock(&o2hb_live_lock); |
| + list_del(®->hr_all_item); |
| + if (o2hb_global_heartbeat_active()) |
| + clear_bit(reg->hr_region_num, o2hb_region_bitmap); |
| + spin_unlock(&o2hb_live_lock); |
| free: |
| kfree(reg); |
| return ERR_PTR(ret); |
| -- |
| 2.27.0 |
| |