From: Alexander Vladimirov Date: Tue, 24 Jun 2014 18:54:52 +0000 (+0800) Subject: Prevent write_config from corrupting container config X-Git-Tag: lxc-1.1.0.alpha1~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd986e08740aa330a230cb53a909b723b1f1f00a;p=thirdparty%2Flxc.git Prevent write_config from corrupting container config write_config doesn't check the value sig_name function returns, this causes write_config to produce corrupted container config when using non-predefined signal names. Signed-off-by: Alexander Vladimirov Acked-by: Serge E. Hallyn --- diff --git a/src/lxc/confile.c b/src/lxc/confile.c index 3462e9c03..855b81620 100644 --- a/src/lxc/confile.c +++ b/src/lxc/confile.c @@ -1168,7 +1168,7 @@ static const char *sig_name(int signum) { if (signum == signames[n].num) return signames[n].name; } - return ""; + return NULL; } static int sig_parse(const char *signame) { @@ -2289,6 +2289,7 @@ void write_config(FILE *fout, struct lxc_conf *c) { struct lxc_list *it; int i; + const char *signame; /* first write any includes */ lxc_list_for_each(it, &c->includes) { @@ -2336,10 +2337,22 @@ void write_config(FILE *fout, struct lxc_conf *c) fprintf(fout, "lxc.pts = %d\n", c->pts); if (c->ttydir) fprintf(fout, "lxc.devttydir = %s\n", c->ttydir); - if (c->haltsignal) - fprintf(fout, "lxc.haltsignal = SIG%s\n", sig_name(c->haltsignal)); - if (c->stopsignal) - fprintf(fout, "lxc.stopsignal = SIG%s\n", sig_name(c->stopsignal)); + if (c->haltsignal) { + signame = sig_name(c->haltsignal); + if (signame == NULL) { + fprintf(fout, "lxc.haltsignal = %d\n", c->haltsignal); + } else { + fprintf(fout, "lxc.haltsignal = SIG%s\n", sig_name(c->haltsignal)); + } + } + if (c->stopsignal) { + signame = sig_name(c->stopsignal); + if (signame == NULL) { + fprintf(fout, "lxc.stopsignal = %d\n", c->stopsignal); + } else { + fprintf(fout, "lxc.stopsignal = SIG%s\n", sig_name(c->stopsignal)); + } + } #if HAVE_SYS_PERSONALITY_H switch(c->personality) { case PER_LINUX32: fprintf(fout, "lxc.arch = i686\n"); break;