diff options
author | Subash Abhinov Kasiviswanathan <subashab@codeaurora.org> | 2019-09-10 14:02:57 -0600 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-09-12 11:55:34 +0100 |
commit | 10cc514f451a0f239aa34f91bc9dc954a9397840 (patch) | |
tree | d0f714afc565abac165983c4870e62b6beda2f3d /fs/crypto | |
parent | d23dbc479a8e813db4161a695d67da0e36557846 (diff) | |
download | linux-10cc514f451a0f239aa34f91bc9dc954a9397840.tar.bz2 |
net: Fix null de-reference of device refcount
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>
Diffstat (limited to 'fs/crypto')
0 files changed, 0 insertions, 0 deletions