diff options
author | Gao Feng <gfree.wind@vip.163.com> | 2017-12-26 08:44:32 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-02 13:30:14 -0500 |
commit | d02fd6e7d2933ede6478a15f9e4ce8a93845824e (patch) | |
tree | 1a6557512b2fab38bf0d5ae9a6d53dbe44ae1db5 | |
parent | 3bb23421a504f01551b7cb9dff0e41dbf16656b0 (diff) |
macvlan: Fix one possible double free
Because the macvlan_uninit would free the macvlan port, so there is one
double free case in macvlan_common_newlink. When the macvlan port is just
created, then register_netdevice or netdev_upper_dev_link failed and they
would invoke macvlan_uninit. Then it would reach the macvlan_port_destroy
which triggers the double free.
Signed-off-by: Gao Feng <gfree.wind@vip.163.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/macvlan.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index a178c5efd33e..a0f2be81d52e 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -1444,9 +1444,14 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev, | |||
1444 | return 0; | 1444 | return 0; |
1445 | 1445 | ||
1446 | unregister_netdev: | 1446 | unregister_netdev: |
1447 | /* macvlan_uninit would free the macvlan port */ | ||
1447 | unregister_netdevice(dev); | 1448 | unregister_netdevice(dev); |
1449 | return err; | ||
1448 | destroy_macvlan_port: | 1450 | destroy_macvlan_port: |
1449 | if (create) | 1451 | /* the macvlan port may be freed by macvlan_uninit when fail to register. |
1452 | * so we destroy the macvlan port only when it's valid. | ||
1453 | */ | ||
1454 | if (create && macvlan_port_get_rtnl(dev)) | ||
1450 | macvlan_port_destroy(port->dev); | 1455 | macvlan_port_destroy(port->dev); |
1451 | return err; | 1456 | return err; |
1452 | } | 1457 | } |