From e5d2fd7c2a97e3ae38085e8ad90ec8deb92a1a0b Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 16 Jun 2017 17:02:08 +0200 Subject: [PATCH] network: final cleanup Signed-off-by: Christian Brauner --- src/lxc/conf.c | 94 +------------------------------- src/lxc/conf.h | 2 - src/lxc/confile.c | 117 ++++++++++++++++++++-------------------- src/lxc/confile_utils.c | 68 +++++++++++++++-------- src/lxc/confile_utils.h | 1 + 5 files changed, 108 insertions(+), 174 deletions(-) diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 93ef05c63..9d0f6e9e1 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -4282,98 +4282,6 @@ int run_lxc_hooks(const char *name, char *hook, struct lxc_conf *conf, return 0; } -static void lxc_remove_nic(struct lxc_list *it) -{ - struct lxc_netdev *netdev = it->elem; - struct lxc_list *it2,*next; - - lxc_list_del(it); - - free(netdev->link); - free(netdev->name); - if (netdev->type == LXC_NET_VETH) - free(netdev->priv.veth_attr.pair); - free(netdev->upscript); - free(netdev->hwaddr); - free(netdev->mtu); - free(netdev->ipv4_gateway); - free(netdev->ipv6_gateway); - lxc_list_for_each_safe(it2, &netdev->ipv4, next) { - lxc_list_del(it2); - free(it2->elem); - free(it2); - } - lxc_list_for_each_safe(it2, &netdev->ipv6, next) { - lxc_list_del(it2); - free(it2->elem); - free(it2); - } - free(netdev); - free(it); -} - -/* we get passed in something like '0', '0.ipv4' or '1.ipv6' */ -int lxc_clear_nic(struct lxc_conf *c, const char *key) -{ - char *p1; - int ret, idx, i; - struct lxc_list *it; - struct lxc_netdev *netdev; - - p1 = strchr(key, '.'); - if (!p1 || *(p1+1) == '\0') - p1 = NULL; - - ret = sscanf(key, "%d", &idx); - if (ret != 1) return -1; - if (idx < 0) - return -1; - - i = 0; - lxc_list_for_each(it, &c->network) { - if (i == idx) - break; - i++; - } - if (i < idx) // we don't have that many nics defined - return -1; - - if (!it || !it->elem) - return -1; - - netdev = it->elem; - - if (!p1) { - lxc_remove_nic(it); - } else if (strcmp(p1, ".ipv4") == 0) { - struct lxc_list *it2,*next; - lxc_list_for_each_safe(it2, &netdev->ipv4, next) { - lxc_list_del(it2); - free(it2->elem); - free(it2); - } - } else if (strcmp(p1, ".ipv6") == 0) { - struct lxc_list *it2,*next; - lxc_list_for_each_safe(it2, &netdev->ipv6, next) { - lxc_list_del(it2); - free(it2->elem); - free(it2); - } - } - else return -1; - - return 0; -} - -int lxc_clear_config_network(struct lxc_conf *c) -{ - struct lxc_list *it,*next; - lxc_list_for_each_safe(it, &c->network, next) { - lxc_remove_nic(it); - } - return 0; -} - int lxc_clear_config_caps(struct lxc_conf *c) { struct lxc_list *it,*next; @@ -4596,7 +4504,7 @@ void lxc_conf_free(struct lxc_conf *conf) free(conf->unexpanded_config); free(conf->pty_names); free(conf->syslog); - lxc_clear_config_network(conf); + lxc_free_networks(conf); free(conf->lsm_aa_profile); free(conf->lsm_se_context); lxc_seccomp_free(conf); diff --git a/src/lxc/conf.h b/src/lxc/conf.h index fbe2e109c..7bf624395 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -442,8 +442,6 @@ extern int lxc_find_gateway_addresses(struct lxc_handler *handler); extern int lxc_create_tty(const char *name, struct lxc_conf *conf); extern void lxc_delete_tty(struct lxc_tty_info *tty_info); -extern int lxc_clear_config_network(struct lxc_conf *c); -extern int lxc_clear_nic(struct lxc_conf *c, const char *key); extern int lxc_clear_config_caps(struct lxc_conf *c); extern int lxc_clear_config_keepcaps(struct lxc_conf *c); extern int lxc_clear_cgroups(struct lxc_conf *c, const char *key); diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 11c0a2ba5..c5b79cd5d 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -430,37 +430,37 @@ static int get_config_limit(const char *, char *, int, struct lxc_conf *, static int clr_config_limit(const char *, struct lxc_conf *, void *); static struct lxc_config_t config[] = { - { "lxc.arch", set_config_personality, get_config_personality, clr_config_personality, }, - { "lxc.pts", set_config_pts, get_config_pts, clr_config_pts, }, - { "lxc.tty", set_config_tty, get_config_tty, clr_config_tty, }, - { "lxc.devttydir", set_config_ttydir, get_config_ttydir, clr_config_ttydir, }, - { "lxc.kmsg", set_config_kmsg, get_config_kmsg, clr_config_kmsg, }, - { "lxc.aa_profile", set_config_lsm_aa_profile, get_config_lsm_aa_profile, clr_config_lsm_aa_profile, }, - { "lxc.aa_allow_incomplete", set_config_lsm_aa_incomplete, get_config_lsm_aa_incomplete, clr_config_lsm_aa_incomplete, }, - { "lxc.se_context", set_config_lsm_se_context, get_config_lsm_se_context, clr_config_lsm_se_context, }, - { "lxc.cgroup", set_config_cgroup, get_config_cgroup, clr_config_cgroup, }, - { "lxc.id_map", set_config_idmaps, get_config_idmaps, clr_config_idmaps, }, - { "lxc.loglevel", set_config_loglevel, get_config_loglevel, clr_config_loglevel, }, - { "lxc.logfile", set_config_logfile, get_config_logfile, clr_config_logfile, }, - { "lxc.mount.entry", set_config_mount, get_config_mount, clr_config_mount, }, - { "lxc.mount.auto", set_config_mount_auto, get_config_mount_auto, clr_config_mount_auto, }, - { "lxc.mount", set_config_fstab, get_config_fstab, clr_config_fstab, }, - { "lxc.rootfs.mount", set_config_rootfs_mount, get_config_rootfs_mount, clr_config_rootfs_mount, }, - { "lxc.rootfs.options", set_config_rootfs_options, get_config_rootfs_options, clr_config_rootfs_options, }, - { "lxc.rootfs.backend", set_config_rootfs_backend, get_config_rootfs_backend, clr_config_rootfs_backend, }, - { "lxc.rootfs", set_config_rootfs, get_config_rootfs, clr_config_rootfs, }, - { "lxc.pivotdir", set_config_pivotdir, get_config_pivotdir, clr_config_pivotdir, }, - { "lxc.utsname", set_config_utsname, get_config_utsname, clr_config_utsname, }, - { "lxc.hook.pre-start", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.pre-mount", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.mount", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.autodev", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.start", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.stop", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.post-stop", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.clone", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook.destroy", set_config_hooks, get_config_hooks, clr_config_hooks, }, - { "lxc.hook", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.arch", set_config_personality, get_config_personality, clr_config_personality, }, + { "lxc.pts", set_config_pts, get_config_pts, clr_config_pts, }, + { "lxc.tty", set_config_tty, get_config_tty, clr_config_tty, }, + { "lxc.devttydir", set_config_ttydir, get_config_ttydir, clr_config_ttydir, }, + { "lxc.kmsg", set_config_kmsg, get_config_kmsg, clr_config_kmsg, }, + { "lxc.aa_profile", set_config_lsm_aa_profile, get_config_lsm_aa_profile, clr_config_lsm_aa_profile, }, + { "lxc.aa_allow_incomplete", set_config_lsm_aa_incomplete, get_config_lsm_aa_incomplete, clr_config_lsm_aa_incomplete, }, + { "lxc.se_context", set_config_lsm_se_context, get_config_lsm_se_context, clr_config_lsm_se_context, }, + { "lxc.cgroup", set_config_cgroup, get_config_cgroup, clr_config_cgroup, }, + { "lxc.id_map", set_config_idmaps, get_config_idmaps, clr_config_idmaps, }, + { "lxc.loglevel", set_config_loglevel, get_config_loglevel, clr_config_loglevel, }, + { "lxc.logfile", set_config_logfile, get_config_logfile, clr_config_logfile, }, + { "lxc.mount.entry", set_config_mount, get_config_mount, clr_config_mount, }, + { "lxc.mount.auto", set_config_mount_auto, get_config_mount_auto, clr_config_mount_auto, }, + { "lxc.mount", set_config_fstab, get_config_fstab, clr_config_fstab, }, + { "lxc.rootfs.mount", set_config_rootfs_mount, get_config_rootfs_mount, clr_config_rootfs_mount, }, + { "lxc.rootfs.options", set_config_rootfs_options, get_config_rootfs_options, clr_config_rootfs_options, }, + { "lxc.rootfs.backend", set_config_rootfs_backend, get_config_rootfs_backend, clr_config_rootfs_backend, }, + { "lxc.rootfs", set_config_rootfs, get_config_rootfs, clr_config_rootfs, }, + { "lxc.pivotdir", set_config_pivotdir, get_config_pivotdir, clr_config_pivotdir, }, + { "lxc.utsname", set_config_utsname, get_config_utsname, clr_config_utsname, }, + { "lxc.hook.pre-start", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.pre-mount", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.mount", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.autodev", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.start", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.stop", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.post-stop", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.clone", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook.destroy", set_config_hooks, get_config_hooks, clr_config_hooks, }, + { "lxc.hook", set_config_hooks, get_config_hooks, clr_config_hooks, }, { "lxc.network.type", set_config_network_type, get_config_network_type, clr_config_network_type, }, { "lxc.network.flags", set_config_network_flags, get_config_network_flags, clr_config_network_flags, }, { "lxc.network.link", set_config_network_link, get_config_network_link, clr_config_network_link, }, @@ -476,31 +476,31 @@ static struct lxc_config_t config[] = { { "lxc.network.ipv4", set_config_network_ipv4, get_config_network_ipv4, clr_config_network_ipv4, }, { "lxc.network.ipv6.gateway", set_config_network_ipv6_gateway, get_config_network_ipv6_gateway, clr_config_network_ipv6_gateway, }, { "lxc.network.ipv6", set_config_network_ipv6, get_config_network_ipv6, clr_config_network_ipv6, }, - { "lxc.network.", set_config_network_nic, get_config_network_nic, clr_config_network_nic, }, - { "lxc.network", set_config_network, get_config_network, clr_config_network, }, - { "lxc.cap.drop", set_config_cap_drop, get_config_cap_drop, clr_config_cap_drop, }, - { "lxc.cap.keep", set_config_cap_keep, get_config_cap_keep, clr_config_cap_keep, }, - { "lxc.console.logfile", set_config_console_logfile, get_config_console_logfile, clr_config_console_logfile, }, - { "lxc.console", set_config_console, get_config_console, clr_config_console, }, - { "lxc.seccomp", set_config_seccomp, get_config_seccomp, clr_config_seccomp, }, - { "lxc.include", set_config_includefiles, get_config_includefiles, clr_config_includefiles, }, - { "lxc.autodev", set_config_autodev, get_config_autodev, clr_config_autodev, }, - { "lxc.haltsignal", set_config_haltsignal, get_config_haltsignal, clr_config_haltsignal, }, - { "lxc.rebootsignal", set_config_rebootsignal, get_config_rebootsignal, clr_config_rebootsignal, }, - { "lxc.stopsignal", set_config_stopsignal, get_config_stopsignal, clr_config_stopsignal, }, - { "lxc.start.auto", set_config_start, get_config_start, clr_config_start, }, - { "lxc.start.delay", set_config_start, get_config_start, clr_config_start, }, - { "lxc.start.order", set_config_start, get_config_start, clr_config_start, }, - { "lxc.monitor.unshare", set_config_monitor, get_config_monitor, clr_config_monitor, }, - { "lxc.group", set_config_group, get_config_group, clr_config_group, }, - { "lxc.environment", set_config_environment, get_config_environment, clr_config_environment, }, - { "lxc.init_cmd", set_config_init_cmd, get_config_init_cmd, clr_config_init_cmd, }, - { "lxc.init_uid", set_config_init_uid, get_config_init_uid, clr_config_init_uid, }, - { "lxc.init_gid", set_config_init_gid, get_config_init_gid, clr_config_init_gid, }, - { "lxc.ephemeral", set_config_ephemeral, get_config_ephemeral, clr_config_ephemeral, }, - { "lxc.syslog", set_config_syslog, get_config_syslog, clr_config_syslog, }, - { "lxc.no_new_privs", set_config_no_new_privs, get_config_no_new_privs, clr_config_no_new_privs, }, - { "lxc.limit", set_config_limit, get_config_limit, clr_config_limit, }, + { "lxc.network.", set_config_network_nic, get_config_network_nic, clr_config_network_nic, }, + { "lxc.network", set_config_network, get_config_network, clr_config_network, }, + { "lxc.cap.drop", set_config_cap_drop, get_config_cap_drop, clr_config_cap_drop, }, + { "lxc.cap.keep", set_config_cap_keep, get_config_cap_keep, clr_config_cap_keep, }, + { "lxc.console.logfile", set_config_console_logfile, get_config_console_logfile, clr_config_console_logfile, }, + { "lxc.console", set_config_console, get_config_console, clr_config_console, }, + { "lxc.seccomp", set_config_seccomp, get_config_seccomp, clr_config_seccomp, }, + { "lxc.include", set_config_includefiles, get_config_includefiles, clr_config_includefiles, }, + { "lxc.autodev", set_config_autodev, get_config_autodev, clr_config_autodev, }, + { "lxc.haltsignal", set_config_haltsignal, get_config_haltsignal, clr_config_haltsignal, }, + { "lxc.rebootsignal", set_config_rebootsignal, get_config_rebootsignal, clr_config_rebootsignal, }, + { "lxc.stopsignal", set_config_stopsignal, get_config_stopsignal, clr_config_stopsignal, }, + { "lxc.start.auto", set_config_start, get_config_start, clr_config_start, }, + { "lxc.start.delay", set_config_start, get_config_start, clr_config_start, }, + { "lxc.start.order", set_config_start, get_config_start, clr_config_start, }, + { "lxc.monitor.unshare", set_config_monitor, get_config_monitor, clr_config_monitor, }, + { "lxc.group", set_config_group, get_config_group, clr_config_group, }, + { "lxc.environment", set_config_environment, get_config_environment, clr_config_environment, }, + { "lxc.init_cmd", set_config_init_cmd, get_config_init_cmd, clr_config_init_cmd, }, + { "lxc.init_uid", set_config_init_uid, get_config_init_uid, clr_config_init_uid, }, + { "lxc.init_gid", set_config_init_gid, get_config_init_gid, clr_config_init_gid, }, + { "lxc.ephemeral", set_config_ephemeral, get_config_ephemeral, clr_config_ephemeral, }, + { "lxc.syslog", set_config_syslog, get_config_syslog, clr_config_syslog, }, + { "lxc.no_new_privs", set_config_no_new_privs, get_config_no_new_privs, clr_config_no_new_privs, }, + { "lxc.limit", set_config_limit, get_config_limit, clr_config_limit, }, }; struct signame { @@ -682,7 +682,7 @@ static int set_config_network(const char *key, const char *value, return -1; } - return lxc_clear_config_network(lxc_conf); + return clr_config_network(key, lxc_conf, data); } static int macvlan_mode(int *valuep, const char *value); @@ -4066,7 +4066,8 @@ static inline int clr_config_hooks(const char *key, struct lxc_conf *c, static inline int clr_config_network(const char *key, struct lxc_conf *c, void *data) { - return lxc_clear_config_network(c); + lxc_free_networks(c); + return 0; } static inline int clr_config_cap_drop(const char *key, struct lxc_conf *c, diff --git a/src/lxc/confile_utils.c b/src/lxc/confile_utils.c index b67fe578d..cfa7caa54 100644 --- a/src/lxc/confile_utils.c +++ b/src/lxc/confile_utils.c @@ -294,9 +294,39 @@ void lxc_log_configured_netdevs(const struct lxc_conf *conf) } } +static void lxc_free_netdev(struct lxc_netdev *netdev) +{ + struct lxc_list *cur, *next; + + free(netdev->link); + free(netdev->name); + if (netdev->type == LXC_NET_VETH) + free(netdev->priv.veth_attr.pair); + free(netdev->upscript); + free(netdev->downscript); + free(netdev->hwaddr); + free(netdev->mtu); + + free(netdev->ipv4_gateway); + lxc_list_for_each_safe(cur, &netdev->ipv4, next) { + lxc_list_del(cur); + free(cur->elem); + free(cur); + } + + free(netdev->ipv6_gateway); + lxc_list_for_each_safe(cur, &netdev->ipv6, next) { + lxc_list_del(cur); + free(cur->elem); + free(cur); + } + + free(netdev); +} + bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx) { - struct lxc_list *cur, *it, *next; + struct lxc_list *cur, *next; struct lxc_netdev *netdev; bool found = false; @@ -313,27 +343,23 @@ bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx) if (!found) return false; - free(netdev->link); - free(netdev->name); - if (netdev->type == LXC_NET_VETH) - free(netdev->priv.veth_attr.pair); - free(netdev->upscript); - free(netdev->hwaddr); - free(netdev->mtu); - free(netdev->ipv4_gateway); - free(netdev->ipv6_gateway); - lxc_list_for_each_safe(it, &netdev->ipv4, next) { - lxc_list_del(it); - free(it->elem); - free(it); - } - lxc_list_for_each_safe(it, &netdev->ipv6, next) { - lxc_list_del(it); - free(it->elem); - free(it); - } - free(netdev); + lxc_free_netdev(netdev); free(cur); return true; } + +void lxc_free_networks(struct lxc_conf *conf) +{ + struct lxc_list *cur, *next; + struct lxc_netdev *netdev; + + lxc_list_for_each_safe(cur, &conf->network, next) { + netdev = cur->elem; + lxc_free_netdev(netdev); + free(cur); + } + + /* prevent segfaults */ + lxc_list_init(&conf->network); +} diff --git a/src/lxc/confile_utils.h b/src/lxc/confile_utils.h index c33ba0473..17bfce628 100644 --- a/src/lxc/confile_utils.h +++ b/src/lxc/confile_utils.h @@ -34,5 +34,6 @@ extern struct lxc_netdev *lxc_get_netdev_by_idx(struct lxc_conf *conf, unsigned int idx); extern void lxc_log_configured_netdevs(const struct lxc_conf *conf); extern bool lxc_remove_nic_by_idx(struct lxc_conf *conf, unsigned int idx); +extern void lxc_free_networks(struct lxc_conf *conf); #endif /* __LXC_CONFILE_UTILS_H */ -- 2.47.3