[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210708073745.13797-1-yajun.deng@linux.dev>
Date: Thu, 8 Jul 2021 15:37:45 +0800
From: Yajun Deng <yajun.deng@...ux.dev>
To: davem@...emloft.net, kuba@...nel.org, ryazanov.s.a@...il.com,
johannes.berg@...el.com, avagin@...il.com, vladimir.oltean@....com,
cong.wang@...edance.com, roopa@...ulusnetworks.com,
yajun.deng@...ux.dev, zhudi21@...wei.com
Cc: netdev@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: [PATCH] net: rtnetlink: Fix rtnl_dereference return value is NULL
rtnl_dereference() may be return NULL in rtnl_unregister(),
so add this case handling.
Signed-off-by: Yajun Deng <yajun.deng@...ux.dev>
---
net/core/rtnetlink.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index f6af3e74fc44..57ce22669b06 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -289,24 +289,27 @@ int rtnl_unregister(int protocol, int msgtype)
struct rtnl_link __rcu **tab;
struct rtnl_link *link;
int msgindex;
+ int ret = -ENOENT;
BUG_ON(protocol < 0 || protocol > RTNL_FAMILY_MAX);
msgindex = rtm_msgindex(msgtype);
rtnl_lock();
tab = rtnl_dereference(rtnl_msg_handlers[protocol]);
- if (!tab) {
- rtnl_unlock();
- return -ENOENT;
- }
+ if (!tab)
+ goto unlock;
link = rtnl_dereference(tab[msgindex]);
- rcu_assign_pointer(tab[msgindex], NULL);
- rtnl_unlock();
+ if (!link)
+ goto unlock;
+ rcu_assign_pointer(tab[msgindex], NULL);
kfree_rcu(link, rcu);
+ ret = 0;
- return 0;
+unlock:
+ rtnl_unlock();
+ return ret;
}
EXPORT_SYMBOL_GPL(rtnl_unregister);
--
2.32.0
Powered by blists - more mailing lists