Skip to content

Commit 0032c99

Browse files
Wang Liangkuba-moo
authored andcommitted
net: fix NULL pointer dereference in l3mdev_l3_rcv
When delete l3s ipvlan: ip link del link eth0 ipvlan1 type ipvlan mode l3s This may cause a null pointer dereference: Call trace: ip_rcv_finish+0x48/0xd0 ip_rcv+0x5c/0x100 __netif_receive_skb_one_core+0x64/0xb0 __netif_receive_skb+0x20/0x80 process_backlog+0xb4/0x204 napi_poll+0xe8/0x294 net_rx_action+0xd8/0x22c __do_softirq+0x12c/0x354 This is because l3mdev_l3_rcv() visit dev->l3mdev_ops after ipvlan_l3s_unregister() assign the dev->l3mdev_ops to NULL. The process like this: (CPU1) | (CPU2) l3mdev_l3_rcv() | check dev->priv_flags: | master = skb->dev; | | | ipvlan_l3s_unregister() | set dev->priv_flags | dev->l3mdev_ops = NULL; | visit master->l3mdev_ops | To avoid this by do not set dev->l3mdev_ops when unregister l3s ipvlan. Suggested-by: David Ahern <[email protected]> Fixes: c675e06 ("ipvlan: decouple l3s mode dependencies from other modes") Signed-off-by: Wang Liang <[email protected]> Reviewed-by: Simon Horman <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent d93a6ca commit 0032c99

File tree

1 file changed

+0
-1
lines changed

1 file changed

+0
-1
lines changed

drivers/net/ipvlan/ipvlan_l3s.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,5 +226,4 @@ void ipvlan_l3s_unregister(struct ipvl_port *port)
226226

227227
dev->priv_flags &= ~IFF_L3MDEV_RX_HANDLER;
228228
ipvlan_unregister_nf_hook(read_pnet(&port->pnet));
229-
dev->l3mdev_ops = NULL;
230229
}

0 commit comments

Comments
 (0)