On 2/2/21 7:32 PM, Dan Carpenter wrote: > 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 > > Fixes: 1cf257f51191 ("ocfs2: fix memory leak") > Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> Looks good. Reviewed-by: Joseph Qi <joseph.qi@xxxxxxxxxxxxxxxxx> > --- > v2: The first version didn't clear the bit. > > 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 0179a73a3fa2..12a7590601dd 100644 > --- a/fs/ocfs2/cluster/heartbeat.c > +++ b/fs/ocfs2/cluster/heartbeat.c > @@ -2042,7 +2042,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), > @@ -2057,6 +2057,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); >