From: Sam Boyles Date: Fri, 26 Mar 2021 02:00:18 +0000 (+1300) Subject: network: handle name collisions when returning physical interfaces to host X-Git-Tag: lxc-5.0.0~241^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb301db761fb719c743a314bd5ff466f29af590c;p=thirdparty%2Flxc.git network: handle name collisions when returning physical interfaces to host Reviewed-by: Blair Steven Signed-off-by: Sam Boyles --- diff --git a/src/lxc/network.c b/src/lxc/network.c index ed4b8ff33..52d8e9133 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -3612,6 +3612,10 @@ static bool lxc_delete_network_priv(struct lxc_handler *handler) } if (netdev->type == LXC_NET_PHYS) { + /* Physical interfaces are initially returned to the parent namespace + * with their transient name to avoid collisions + */ + netdev->ifindex = if_nametoindex(netdev->transient_name); ret = lxc_netdev_rename_by_index(netdev->ifindex, netdev->link); if (ret < 0) WARN("Failed to rename interface with index %d " @@ -3684,6 +3688,12 @@ clear_ifindices: netdev->priv.veth_attr.veth1[0] = '\0'; netdev->priv.veth_attr.ifindex = 0; } + + /* Clear transient name */ + if (!is_empty_string (netdev->transient_name)) + { + netdev->transient_name[0] = '\0'; + } } return true; @@ -3761,7 +3771,10 @@ int lxc_restore_phys_nics_to_netns(struct lxc_handler *handler) continue; } - ret = lxc_netdev_move_by_index_fd(netdev->ifindex, oldfd, netdev->link); + /* Restore physical interfaces to host's network namespace with its transient name + * to avoid collisions with the host's other interfaces. + */ + ret = lxc_netdev_move_by_index_fd(netdev->ifindex, oldfd, netdev->transient_name); if (ret < 0) WARN("Error moving network device \"%s\" back to network namespace", ifname); else diff --git a/src/lxc/network.h b/src/lxc/network.h index 88523586e..3526f106f 100644 --- a/src/lxc/network.h +++ b/src/lxc/network.h @@ -136,6 +136,7 @@ union netdev_p { * @created_name : the name with which this interface got created before * being renamed to final_name. * Currenly only used for veth devices. + * @transient_name : temporary name to avoid namespace collisions * @hwaddr : mac address * @mtu : maximum transmission unit * @priv : information specific to the specificed network type