]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: check allocation succeeds
authorMichael Santos <michael.santos@gmail.com>
Sat, 19 Mar 2011 15:11:31 +0000 (11:11 -0400)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Tue, 22 Mar 2011 14:04:52 +0000 (15:04 +0100)
Signed-off-by: Michael Santos <michael.santos@gmail.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/confile.c

index 1d30cba081bbdf4af2e2ac7cbb555c6aa826aa62..791f04f3db1188e6928ae4396f67aebcbe4714e6 100644 (file)
@@ -195,7 +195,7 @@ static struct lxc_netdev *network_netdev(const char *key, const char *value,
 
 static int network_ifname(char **valuep, char *value)
 {
-       if (strlen(value) > IFNAMSIZ) {
+       if (strlen(value) >= IFNAMSIZ) {
                ERROR("invalid interface name: %s", value);
                return -1;
        }
@@ -553,8 +553,8 @@ static int config_cgroup(const char *key, char *value, struct lxc_conf *lxc_conf
 {
        char *token = "lxc.cgroup.";
        char *subkey;
-       struct lxc_list *cglist;
-       struct lxc_cgroup *cgelem;
+       struct lxc_list *cglist = NULL;
+       struct lxc_cgroup *cgelem = NULL;
 
        subkey = strstr(key, token);
 
@@ -571,21 +571,40 @@ static int config_cgroup(const char *key, char *value, struct lxc_conf *lxc_conf
 
        cglist = malloc(sizeof(*cglist));
        if (!cglist)
-               return -1;
+               goto out;
 
        cgelem = malloc(sizeof(*cgelem));
-       if (!cgelem) {
-               free(cglist);
-               return -1;
-       }
+       if (!cgelem)
+               goto out;
+       memset(cgelem, 0, sizeof(*cgelem));
 
        cgelem->subsystem = strdup(subkey);
        cgelem->value = strdup(value);
+
+       if (!cgelem->subsystem || !cgelem->value)
+               goto out;
+
        cglist->elem = cgelem;
 
        lxc_list_add_tail(&lxc_conf->cgroup, cglist);
 
        return 0;
+
+out:
+       if (cglist)
+               free(cglist);
+
+       if (cgelem) {
+               if (cgelem->subsystem)
+                       free(cgelem->subsystem);
+
+               if (cgelem->value)
+                       free(cgelem->value);
+
+               free(cgelem);
+       }
+
+       return -1;
 }
 
 static int config_fstab(const char *key, char *value, struct lxc_conf *lxc_conf)
@@ -631,6 +650,8 @@ static int config_mount(const char *key, char *value, struct lxc_conf *lxc_conf)
                return -1;
 
        mntelem = strdup(value);
+       if (!mntelem)
+               return -1;
        mntlist->elem = mntelem;
 
        lxc_list_add_tail(&lxc_conf->mount_list, mntlist);