network: remove allocation from lxc_mkifname()

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