diff options
author | Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> | 2019-09-10 14:02:57 -0600 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2019-11-22 15:57:29 +0000 |
commit | c6efe293fe6f584e0f6e67308f6a8ef476492748 (patch) | |
tree | 8634959a5f5acb1abfc8693df33c1f3914350039 /net/iucv | |
parent | e8b8edee6f5614fb237006103112e09861abfae7 (diff) | |
download | linux-stable-c6efe293fe6f584e0f6e67308f6a8ef476492748.tar.gz linux-stable-c6efe293fe6f584e0f6e67308f6a8ef476492748.tar.bz2 linux-stable-c6efe293fe6f584e0f6e67308f6a8ef476492748.zip |
net: Fix null de-reference of device refcount
commit 10cc514f451a0f239aa34f91bc9dc954a9397840 upstream.
In event of failure during register_netdevice, free_netdev is
invoked immediately. free_netdev assumes that all the netdevice
refcounts have been dropped prior to it being called and as a
result frees and clears out the refcount pointer.
However, this is not necessarily true as some of the operations
in the NETDEV_UNREGISTER notifier handlers queue RCU callbacks for
invocation after a grace period. The IPv4 callback in_dev_rcu_put
tries to access the refcount after free_netdev is called which
leads to a null de-reference-
44837.761523: <6> Unable to handle kernel paging request at
virtual address 0000004a88287000
44837.761651: <2> pc : in_dev_finish_destroy+0x4c/0xc8
44837.761654: <2> lr : in_dev_finish_destroy+0x2c/0xc8
44837.762393: <2> Call trace:
44837.762398: <2> in_dev_finish_destroy+0x4c/0xc8
44837.762404: <2> in_dev_rcu_put+0x24/0x30
44837.762412: <2> rcu_nocb_kthread+0x43c/0x468
44837.762418: <2> kthread+0x118/0x128
44837.762424: <2> ret_from_fork+0x10/0x1c
Fix this by waiting for the completion of the call_rcu() in
case of register_netdevice errors.
Fixes: 93ee31f14f6f ("[NET]: Fix free_netdev on register_netdev failure.")
Cc: Sean Tranchetti <stranche@codeaurora.org>
Signed-off-by: Subash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'net/iucv')
0 files changed, 0 insertions, 0 deletions