]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: clear netdev on network type change
authorChristian Brauner <christian.brauner@ubuntu.com>
Mon, 29 Mar 2021 10:01:49 +0000 (12:01 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 29 Mar 2021 10:26:11 +0000 (12:26 +0200)
Link: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=32584
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/confile.c
src/lxc/confile_utils.c
src/lxc/confile_utils.h

index e63bba2647002397b2df6ca44b8ff3a4fffe0949..35c65b99d93fd480eeb4b78b582d1b0d046d0556 100644 (file)
@@ -335,8 +335,9 @@ static int set_config_net_type(const char *key, const char *value,
        if (!netdev)
                return ret_errno(EINVAL);
 
+       clr_config_net_type(key, lxc_conf, data);
        if (lxc_config_value_empty(value))
-               return clr_config_net_type(key, lxc_conf, data);
+               return 0;
 
        if (strequal(value, "veth")) {
                netdev->type = LXC_NET_VETH;
@@ -5341,7 +5342,7 @@ static int clr_config_net_type(const char *key, struct lxc_conf *lxc_conf,
        if (!netdev)
                return ret_errno(EINVAL);
 
-       netdev->type = -1;
+       lxc_clear_netdev(netdev);
 
        return 0;
 }
index 06b4869cea5e784cf660156318bf4755d4d56774..4d52d044d129136e863aa44b104d37bffd3c9838 100644 (file)
@@ -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;
+       ssize_t idx;
 
        if (!netdev)
                return;
 
-       free(netdev->upscript);
-       free(netdev->downscript);
-       free(netdev->hwaddr);
-       free(netdev->mtu);
+       idx = netdev->idx;
+
+       free_disarm(netdev->upscript);
+       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_del(cur);
                free(cur->elem);
                free(cur);
        }
 
-       free(netdev->ipv6_gateway);
+       free_disarm(netdev->ipv6_gateway);
        lxc_list_for_each_safe(cur, &netdev->ipv6, next) {
                lxc_list_del(cur);
                free(cur->elem);
@@ -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)
index 670f3894b8774d0d5b22e356a0bb0cee57fce8d0..f675ac176f8ac907fe0d23c00e31551c9ea4cd69 100644 (file)
@@ -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 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_clear_netdev(struct lxc_netdev *netdev);
 __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 int lxc_macvlan_mode_to_flag(int *mode, const char *value);