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.0.5~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=beb5f0696cf292cf6ebddb2c8e0ee11e60281dd5;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 47b285e30..b5e376656 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) { @@ -2222,6 +2222,7 @@ void write_config(FILE *fout, struct lxc_conf *c) { struct lxc_list *it; int i; + const char *signame; if (c->fstab) fprintf(fout, "lxc.mount = %s\n", c->fstab); @@ -2259,10 +2260,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 = x86\n"); break;