confile: clear netdev on network type change

parent 24ca9420
...@@ -316,8 +316,9 @@ static int set_config_net_type(const char *key, const char *value, ...@@ -316,8 +316,9 @@ static int set_config_net_type(const char *key, const char *value,
if (!netdev) if (!netdev)
return ret_errno(EINVAL); return ret_errno(EINVAL);
clr_config_net_type(key, lxc_conf, data);
if (lxc_config_value_empty(value)) if (lxc_config_value_empty(value))
return clr_config_net_type(key, lxc_conf, data); return 0;
if (strequal(value, "veth")) { if (strequal(value, "veth")) {
netdev->type = LXC_NET_VETH; netdev->type = LXC_NET_VETH;
...@@ -4871,7 +4872,7 @@ static int clr_config_net_type(const char *key, struct lxc_conf *lxc_conf, ...@@ -4871,7 +4872,7 @@ static int clr_config_net_type(const char *key, struct lxc_conf *lxc_conf,
if (!netdev) if (!netdev)
return ret_errno(EINVAL); return ret_errno(EINVAL);
netdev->type = -1; lxc_clear_netdev(netdev);
return 0; return 0;
} }
......
...@@ -403,26 +403,29 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf) ...@@ -403,26 +403,29 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf)
} }
} }
static void lxc_free_netdev(struct lxc_netdev *netdev) void lxc_clear_netdev(struct lxc_netdev *netdev)
{ {
struct lxc_list *cur, *next; struct lxc_list *cur, *next;
ssize_t idx;
if (!netdev) if (!netdev)
return; return;
free(netdev->upscript); idx = netdev->idx;
free(netdev->downscript);
free(netdev->hwaddr); free_disarm(netdev->upscript);
free(netdev->mtu); free_disarm(netdev->downscript);
free_disarm(netdev->hwaddr);
free_disarm(netdev->mtu);
free(netdev->ipv4_gateway); free_disarm(netdev->ipv4_gateway);
lxc_list_for_each_safe(cur, &netdev->ipv4, next) { lxc_list_for_each_safe(cur, &netdev->ipv4, next) {
lxc_list_del(cur); lxc_list_del(cur);
free(cur->elem); free(cur->elem);
free(cur); free(cur);
} }
free(netdev->ipv6_gateway); free_disarm(netdev->ipv6_gateway);
lxc_list_for_each_safe(cur, &netdev->ipv6, next) { lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
lxc_list_del(cur); lxc_list_del(cur);
free(cur->elem); free(cur->elem);
...@@ -448,7 +451,19 @@ static void lxc_free_netdev(struct lxc_netdev *netdev) ...@@ -448,7 +451,19 @@ static void lxc_free_netdev(struct lxc_netdev *netdev)
} }
} }
free(netdev); memset(netdev, 0, sizeof(struct lxc_netdev));
lxc_list_init(&netdev->ipv4);
lxc_list_init(&netdev->ipv6);
netdev->type = -1;
netdev->idx = idx;
}
static void lxc_free_netdev(struct lxc_netdev *netdev)
{
if (netdev) {
lxc_clear_netdev(netdev);
free(netdev);
}
} }
bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx) bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx)
......
...@@ -37,6 +37,7 @@ __hidden extern struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf, ...@@ -37,6 +37,7 @@ __hidden extern struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf,
__hidden extern void lxc_log_configured_netdevs(const struct lxc_conf *conf); __hidden extern void lxc_log_configured_netdevs(const struct lxc_conf *conf);
__hidden extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx); __hidden extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx);
__hidden extern void lxc_free_networks(struct lxc_list *networks); __hidden extern void lxc_free_networks(struct lxc_list *networks);
__hidden extern void lxc_clear_netdev(struct lxc_netdev *netdev);
__hidden extern int lxc_veth_mode_to_flag(int *mode, const char *value); __hidden extern int lxc_veth_mode_to_flag(int *mode, const char *value);
__hidden extern char *lxc_veth_flag_to_mode(int mode); __hidden extern char *lxc_veth_flag_to_mode(int mode);
__hidden extern int lxc_macvlan_mode_to_flag(int *mode, const char *value); __hidden extern int lxc_macvlan_mode_to_flag(int *mode, const char *value);
......
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