2
0
mirror of git://github.com/lxc/lxc synced 2025-09-01 13:19:45 +00:00

network: remove allocation from lxc_mkifname()

lxc_mkifname() really doesn't need to allocate any memory.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
This commit is contained in:
Christian Brauner
2017-09-03 20:37:21 +02:00
parent 2958919632
commit 966e9f1fc8
4 changed files with 25 additions and 40 deletions

View File

@@ -767,14 +767,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);
} }
} }

View File

@@ -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 {

View File

@@ -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
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;
} }
@@ -1918,14 +1915,14 @@ const char *lxc_net_type_to_str(int type)
static const char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const char padchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char *lxc_mkifname(const char *template) char *lxc_mkifname(char *template)
{ {
int ifexists = 0;
size_t i = 0;
char *name = NULL;
unsigned int seed; unsigned int seed;
FILE *urandom; FILE *urandom;
struct ifaddrs *ifa, *ifaddr; 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;
@@ -1949,17 +1946,14 @@ char *lxc_mkifname(const char *template)
/* Generate random names until we find one that doesn't exist. */ /* Generate random names until we find one that doesn't exist. */
while (true) { 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
name[i] = padchar[rand_r(&seed) % name[i] = padchar[rand_r(&seed) % (strlen(padchar) - 1)];
(strlen(padchar) - 1)];
#else #else
name[i] = padchar[rand() % (strlen(padchar) - 1)]; name[i] = padchar[rand() % (strlen(padchar) - 1)];
#endif #endif
@@ -1967,20 +1961,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)

View File

@@ -256,7 +256,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);