[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