]> git.proxmox.com Git - mirror_lxc.git/commitdiff
lxc: avoid memory corruption on ppc and s390 V4
authorMichel Normand <NORMAND@fr.ibm.com>
Fri, 8 Jan 2010 13:34:13 +0000 (14:34 +0100)
committerDaniel Lezcano <dlezcano@fr.ibm.com>
Fri, 8 Jan 2010 13:34:13 +0000 (14:34 +0100)
conf object is on stack and is used in forked process.

Signed-off-by: Michel Normand <normand@fr.ibm.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
src/lxc/conf.c
src/lxc/conf.h
src/lxc/lxc_execute.c
src/lxc/lxc_start.c

index da7c945d836f0e6f946371f440ffc1f23e7b32e7..b56e880e594f03144281443f22cdbfde295fc886 100644 (file)
@@ -815,18 +815,28 @@ out:
        return ret;
 }
 
-int lxc_conf_init(struct lxc_conf *conf)
+struct lxc_conf *lxc_conf_init(void)
 {
-       conf->rootfs = NULL;
-       conf->fstab = NULL;
-       conf->utsname = NULL;
-       conf->tty = 0;
-       conf->pts = 0;
-       conf->console[0] = '\0';
-       lxc_list_init(&conf->cgroup);
-       lxc_list_init(&conf->network);
-       lxc_list_init(&conf->mount_list);
-       return 0;
+       struct lxc_conf *new;
+
+       new =   malloc(sizeof(*new));
+       if (!new) {
+               ERROR("lxc_conf_init : %m");
+               return NULL;
+       }
+       memset(new, 0, sizeof(*new));
+
+       new->rootfs = NULL;
+       new->fstab = NULL;
+       new->utsname = NULL;
+       new->tty = 0;
+       new->pts = 0;
+       new->console[0] = '\0';
+       lxc_list_init(&new->cgroup);
+       lxc_list_init(&new->network);
+       lxc_list_init(&new->mount_list);
+
+       return new;
 }
 
 static int instanciate_veth(struct lxc_netdev *netdev)
index 8548eeb538cf6954f5fe6fe7dd7d419d0ba679d6..c4e5deb6121aa84225629d903e7fd78e0c3b6424 100644 (file)
@@ -171,7 +171,7 @@ struct lxc_conf {
 /*
  * Initialize the lxc configuration structure
  */
-extern int lxc_conf_init(struct lxc_conf *conf);
+extern struct lxc_conf *lxc_conf_init(void);
 
 extern int lxc_create_network(struct lxc_list *networks);
 extern int lxc_assign_network(struct lxc_list *networks, pid_t pid);
index 40a4b93c523470b5ccd5dfbd539fb08263e53dc2..50fec10d4f3a3eea9fd67286685c61e4b5aabfeb 100644 (file)
@@ -84,7 +84,7 @@ int main(int argc, char *argv[])
 {
        static char **args;
        char *rcfile;
-       struct lxc_conf conf;
+       struct lxc_conf *conf;
 
        if (lxc_arguments_parse(&my_args, argc, argv))
                return -1;
@@ -113,16 +113,17 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (lxc_conf_init(&conf)) {
-               ERROR("failed to initialze configuration");
+       conf = lxc_conf_init();
+       if (!conf) {
+               ERROR("failed to initialize configuration");
                return -1;
        }
 
-       if (rcfile && lxc_config_read(rcfile, &conf)) {
+       if (rcfile && lxc_config_read(rcfile, conf)) {
                ERROR("failed to read configuration file");
                return -1;
        }
 
-       return lxc_start(my_args.name, args, &conf);
+       return lxc_start(my_args.name, args, conf);
 }
 
index d2471ebbae10f736ec20e70b252ebcaf5b38e02b..fdd3b156872da133ebc8d4940a59da7ea65c6db4 100644 (file)
@@ -133,7 +133,7 @@ int main(int argc, char *argv[])
        };
 
        char *rcfile = NULL;
-       struct lxc_conf conf;
+       struct lxc_conf *conf;
 
        if (lxc_arguments_parse(&my_args, argc, argv))
                return err;
@@ -163,12 +163,13 @@ int main(int argc, char *argv[])
                }
        }
 
-       if (lxc_conf_init(&conf)) {
-               ERROR("failed to initialze configuration");
+       conf = lxc_conf_init();
+       if (!conf) {
+               ERROR("failed to initialize configuration");
                return err;
        }
 
-       if (rcfile && lxc_config_read(rcfile, &conf)) {
+       if (rcfile && lxc_config_read(rcfile, conf)) {
                ERROR("failed to read configuration file");
                return err;
        }
@@ -204,7 +205,7 @@ int main(int argc, char *argv[])
 
        save_tty(&tios);
 
-       err = lxc_start(my_args.name, args, &conf);
+       err = lxc_start(my_args.name, args, conf);
 
        restore_tty(&tios);