]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
network: final cleanup
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 16 Jun 2017 15:02:08 +0000 (17:02 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 18 Jun 2017 09:55:33 +0000 (11:55 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.c
src/lxc/conf.h
src/lxc/confile.c
src/lxc/confile_utils.c
src/lxc/confile_utils.h

index 93ef05c634ae45c8c2bce3e70de68a0d03abe43a..9d0f6e9e1f8ae0226b15fcdbb5bb9227dd63004e 100644 (file)
@@ -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);
index fbe2e109ce866e3b088371e5f5b0bcc9a6324624..7bf624395aebf04fcca3e70a630031d14c92e67a 100644 (file)
@@ -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);
index 11c0a2ba5796bcb7ef62d825d97b8619d223174a..c5b79cd5d25f8daab50f09fc9315a4cd6da14c1b 100644 (file)
@@ -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,
index b67fe578d1a70898c510a067b4a8209aa179d19a..cfa7caa546d357c89b55f098d4b1335adaf35cfb 100644 (file)
@@ -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);
+}
index c33ba047374f9ae1633a6b8b8c16c74263cb3118..17bfce628602936fcff88b18361416a54620b643 100644 (file)
@@ -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 */