]> git.proxmox.com Git - mirror_lxc.git/commitdiff
network: send ifindex for unpriv networks
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 27 Aug 2017 02:59:57 +0000 (04:59 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 27 Aug 2017 15:51:41 +0000 (17:51 +0200)
We use the ifindex as an indicator that liblxc created the network so let's
record it for the unprivileged case as well.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.c
src/lxc/lxc_user_nic.c

index 5adeebbc36647bf33bf373b551dfb1ea181c5eb1..2be6d2ed335b742851a11963589df9c3f41f2ae2 100644 (file)
@@ -3274,6 +3274,7 @@ bool lxc_delete_network(struct lxc_handler *handler)
 static int unpriv_assign_nic(const char *lxcpath, char *lxcname,
                             struct lxc_netdev *netdev, pid_t pid)
 {
+       int ret;
        pid_t child;
        int bytes, pipefd[2];
        char *token, *saveptr = NULL;
@@ -3387,6 +3388,17 @@ static int unpriv_assign_nic(const char *lxcpath, char *lxcname,
                return -1;
        }
 
+       /* fill netdev->veth_attr.pair field */
+       token = strtok_r(NULL, ":", &saveptr);
+       if (!token)
+               return -1;
+
+       ret = lxc_safe_int(token, &netdev->ifindex);
+       if (ret < 0) {
+               ERROR("Failed to parse ifindex for network device \"%s\"", netdev->name);
+               return -1;
+       }
+
        return 0;
 }
 
index 5769dfb480a12f01a0c202721f5b19b1eb7de088..3486e5cdd05f34b7a973fd0a216fbd43c6d2edf4 100644 (file)
@@ -767,7 +767,8 @@ again:
        goto again;
 }
 
-static char *lxc_secure_rename_in_ns(int pid, char *oldname, char *newname)
+static char *lxc_secure_rename_in_ns(int pid, char *oldname, char *newname,
+                                    int *ifidx)
 {
        int ret;
        uid_t ruid, suid, euid;
@@ -850,6 +851,7 @@ static char *lxc_secure_rename_in_ns(int pid, char *oldname, char *newname)
        /* Allocation failure for strdup() is checked below. */
        name = strdup(ifname);
        string_ret = name;
+       *ifidx = ifindex;
 
 do_full_cleanup:
        ret = setresuid(ruid, euid, suid);
@@ -943,7 +945,7 @@ struct user_nic_args {
 
 int main(int argc, char *argv[])
 {
-       int fd, n, pid, ret;
+       int fd, ifindex, n, pid, ret;
        char *me, *newname;
        char *cnic = NULL, *nicname = NULL;
        struct alloted_s *alloted = NULL;
@@ -1018,7 +1020,7 @@ int main(int argc, char *argv[])
        }
 
        /* Now rename the link. */
-       newname = lxc_secure_rename_in_ns(pid, cnic, args.veth_name);
+       newname = lxc_secure_rename_in_ns(pid, cnic, args.veth_name, &ifindex);
        if (!newname) {
                usernic_error("%s", "Failed to rename the link\n");
                ret = lxc_netdev_delete_by_name(cnic);
@@ -1029,7 +1031,7 @@ int main(int argc, char *argv[])
        }
 
        /* Write the name of the interface pair to the stdout: eth0:veth9MT2L4 */
-       fprintf(stdout, "%s:%s\n", newname, nicname);
+       fprintf(stdout, "%s:%s:%d\n", newname, nicname, ifindex);
        free(newname);
        free(nicname);
        exit(EXIT_SUCCESS);