diff options
author | Hoang Le <hoang.h.le@dektech.com.au> | 2020-03-13 10:18:03 +0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-03-15 00:07:00 -0700 |
commit | 746a1eda682cb7b5cd22f1b437da2121af64fbfe (patch) | |
tree | 2cbd7efd493149d7403b5eb8ce615ec63b6c38cf /net/tipc | |
parent | e228c5c0882e809e4fb3eafd07ec25ff50f65ac5 (diff) | |
download | linux-746a1eda682cb7b5cd22f1b437da2121af64fbfe.tar.gz linux-746a1eda682cb7b5cd22f1b437da2121af64fbfe.tar.bz2 linux-746a1eda682cb7b5cd22f1b437da2121af64fbfe.zip |
tipc: add NULL pointer check to prevent kernel oops
Calling:
tipc_node_link_down()->
- tipc_node_write_unlock()->tipc_mon_peer_down()
- tipc_mon_peer_down()
just after disabling bearer could be caused kernel oops.
Fix this by adding a sanity check to make sure valid memory
access.
Acked-by: Jon Maloy <jmaloy@redhat.com>
Signed-off-by: Hoang Le <hoang.h.le@dektech.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r-- | net/tipc/monitor.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c index 58708b4c7719..6dce2abf436e 100644 --- a/net/tipc/monitor.c +++ b/net/tipc/monitor.c @@ -322,9 +322,13 @@ static void mon_assign_roles(struct tipc_monitor *mon, struct tipc_peer *head) void tipc_mon_remove_peer(struct net *net, u32 addr, int bearer_id) { struct tipc_monitor *mon = tipc_monitor(net, bearer_id); - struct tipc_peer *self = get_self(net, bearer_id); + struct tipc_peer *self; struct tipc_peer *peer, *prev, *head; + if (!mon) + return; + + self = get_self(net, bearer_id); write_lock_bh(&mon->lock); peer = get_peer(mon, addr); if (!peer) @@ -407,11 +411,15 @@ exit: void tipc_mon_peer_down(struct net *net, u32 addr, int bearer_id) { struct tipc_monitor *mon = tipc_monitor(net, bearer_id); - struct tipc_peer *self = get_self(net, bearer_id); + struct tipc_peer *self; struct tipc_peer *peer, *head; struct tipc_mon_domain *dom; int applied; + if (!mon) + return; + + self = get_self(net, bearer_id); write_lock_bh(&mon->lock); peer = get_peer(mon, addr); if (!peer) { |