]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
network: remove allocation from lxc_mkifname()
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 3 Sep 2017 18:37:21 +0000 (20:37 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 4 Sep 2017 16:38:00 +0000 (18:38 +0200)
lxc_mkifname() really doesn't need to allocate any memory.

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

index b7354a33b97afdc4f584c30e8ef87c01daf72078..f229369cafade48e0bc72e5e0928b90dc78d7903 100644 (file)
@@ -766,14 +766,10 @@ static bool restore_net_info(struct lxc_container *c)
 
                if (netdev->priv.veth_attr.pair[0] == '\0' &&
                    netdev->priv.veth_attr.veth1[0] == '\0') {
-                       char *tmp;
-
-                       tmp = lxc_mkifname(template);
-                       if (!tmp)
+                       if (!lxc_mkifname(template))
                                goto out_unlock;
 
-                       strcpy(netdev->priv.veth_attr.veth1, tmp);
-                       free(tmp);
+                       strcpy(netdev->priv.veth_attr.veth1, template);
                }
        }
 
index 6920c5462419ebe5168b0647a3efaaf1bf4d395f..9026bc425b4d379adf116009a0f836b2997d6c98 100644 (file)
@@ -566,23 +566,20 @@ out_del:
 static char *get_new_nicname(char *br, int pid, char **cnic)
 {
        int ret;
-       char *nicname;
-       char template[IFNAMSIZ];
+       char nicname[IFNAMSIZ];
 
-       ret = snprintf(template, sizeof(template), "vethXXXXXX");
-       if (ret < 0 || (size_t)ret >= sizeof(template))
+       ret = snprintf(nicname, sizeof(nicname), "vethXXXXXX");
+       if (ret < 0 || (size_t)ret >= sizeof(nicname))
                return NULL;
 
-       nicname = lxc_mkifname(template);
-       if (!nicname)
+       if (!lxc_mkifname(nicname))
                return NULL;
 
        if (!create_nic(nicname, br, pid, cnic)) {
-               free(nicname);
                return NULL;
        }
 
-       return nicname;
+       return strdup(nicname);
 }
 
 struct entry_line {
index 871502cf7e8f33fc71983c6de3945ec4308bdf1b..6f87d07a37d8f0145daa60e5d3de2c79ce1f638d 100644 (file)
@@ -218,9 +218,6 @@ static int instantiate_veth(struct lxc_handler *handler, struct lxc_netdev *netd
 out_delete:
        if (netdev->ifindex != 0)
                lxc_netdev_delete_by_name(veth1);
-       if (netdev->priv.veth_attr.pair != veth1)
-               free(veth1);
-       free(veth2);
        return -1;
 }
 
@@ -247,29 +244,29 @@ static int instantiate_macvlan(struct lxc_handler *handler, struct lxc_netdev *n
        if (err) {
                ERROR("Failed to create macvlan interface \"%s\" on \"%s\": %s",
                      peer, netdev->link, strerror(-err));
-               goto out;
+               goto on_error;
        }
 
        netdev->ifindex = if_nametoindex(peer);
        if (!netdev->ifindex) {
                ERROR("Failed to retrieve ifindex for \"%s\"", peer);
-               goto out;
+               goto on_error;
        }
 
        if (netdev->upscript) {
                err = run_script(handler->name, "net", netdev->upscript, "up",
                                 "macvlan", netdev->link, (char*) NULL);
                if (err)
-                       goto out;
+                       goto on_error;
        }
 
        DEBUG("Instantiated macvlan \"%s\" with ifindex is %d and mode %d",
              peer, netdev->ifindex, netdev->priv.macvlan_attr.mode);
 
        return 0;
-out:
+
+on_error:
        lxc_netdev_delete_by_name(peer);
-       free(peer);
        return -1;
 }
 
@@ -1890,17 +1887,16 @@ const char *lxc_net_type_to_str(int type)
        return lxc_network_types[type];
 }
 
-static const char padchar[] =
-"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+static const char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
-char *lxc_mkifname(const char *template)
+char *lxc_mkifname(char *template)
 {
-       char *name = NULL;
-       size_t i = 0;
-       FILE *urandom;
        unsigned int seed;
-       struct ifaddrs *ifaddr, *ifa;
-       int ifexists = 0;
+       FILE *urandom;
+       struct ifaddrs *ifa, *ifaddr;
+       char name[IFNAMSIZ];
+       bool exists = false;
+       size_t i = 0;
 
        if (strlen(template) >= IFNAMSIZ)
                return NULL;
@@ -1908,28 +1904,26 @@ char *lxc_mkifname(const char *template)
        /* Get all the network interfaces. */
        getifaddrs(&ifaddr);
 
-       /* Initialize the random number generator */
-       urandom = fopen ("/dev/urandom", "r");
+       /* Initialize the random number generator. */
+       urandom = fopen("/dev/urandom", "r");
        if (urandom != NULL) {
-               if (fread (&seed, sizeof(seed), 1, urandom) <= 0)
+               if (fread(&seed, sizeof(seed), 1, urandom) <= 0)
                        seed = time(0);
                fclose(urandom);
-       }
-       else
+       } else {
                seed = time(0);
+       }
 
 #ifndef HAVE_RAND_R
        srand(seed);
 #endif
 
-       /* Generate random names until we find one that doesn't exist */
-       while(1) {
-               ifexists = 0;
-               name = strdup(template);
-
-               if (name == NULL)
-                       return NULL;
+       /* Generate random names until we find one that doesn't exist. */
+       while (true) {
+               name[0] = '\0';
+               strcpy(name, template);
 
+               exists = false;
                for (i = 0; i < strlen(name); i++) {
                        if (name[i] == 'X') {
 #ifdef HAVE_RAND_R
@@ -1941,20 +1935,18 @@ char *lxc_mkifname(const char *template)
                }
 
                for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
-                       if (strcmp(ifa->ifa_name, name) == 0) {
-                               ifexists = 1;
+                       if (!strcmp(ifa->ifa_name, name)) {
+                               exists = true;
                                break;
                        }
                }
 
-               if (ifexists == 0)
+               if (!exists)
                        break;
-
-               free(name);
        }
 
        freeifaddrs(ifaddr);
-       return name;
+       return strcpy(template, name);
 }
 
 int setup_private_host_hw_addr(char *veth1)
index ffe318125e8df422b087709621895c47df1ff44a..c745bfd73dd18fc3484da34d510b62b4b846833d 100644 (file)
@@ -286,7 +286,7 @@ extern int lxc_neigh_proxy_off(const char *name, int family);
 /* Generate a new unique network interface name.
  * Allocated memory must be freed by caller.
  */
-extern char *lxc_mkifname(const char *template);
+extern char *lxc_mkifname(char *template);
 
 extern const char *lxc_net_type_to_str(int type);
 extern int setup_private_host_hw_addr(char *veth1);