[PATCH] net: rtnetlink: Fix rtnl_dereference return value is NULL
From: Yajun Deng
Date: Thu Jul 08 2021 - 03:38:24 EST
rtnl_dereference() may be return NULL in rtnl_unregister(),
so add this case handling.
Signed-off-by: Yajun Deng <yajun.deng@xxxxxxxxx>
---
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