From: Michel Normand Date: Fri, 8 Jan 2010 13:34:13 +0000 (+0100) Subject: lxc: avoid memory corruption on ppc and s390 V4 X-Git-Tag: lxc-2.1.1~3071 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=7b379ab3a54e12c89c664acce557f759258c629a;p=mirror_lxc.git lxc: avoid memory corruption on ppc and s390 V4 conf object is on stack and is used in forked process. Signed-off-by: Michel Normand Signed-off-by: Daniel Lezcano --- diff --git a/src/lxc/conf.c b/src/lxc/conf.c index da7c945d8..b56e880e5 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -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) diff --git a/src/lxc/conf.h b/src/lxc/conf.h index 8548eeb53..c4e5deb61 100644 --- a/src/lxc/conf.h +++ b/src/lxc/conf.h @@ -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); diff --git a/src/lxc/lxc_execute.c b/src/lxc/lxc_execute.c index 40a4b93c5..50fec10d4 100644 --- a/src/lxc/lxc_execute.c +++ b/src/lxc/lxc_execute.c @@ -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); } diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c index d2471ebba..fdd3b1568 100644 --- a/src/lxc/lxc_start.c +++ b/src/lxc/lxc_start.c @@ -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);