]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Prevent write_config from corrupting container config
authorAlexander Vladimirov <alexander.idkfa.vladimirov@gmail.com>
Tue, 24 Jun 2014 18:54:52 +0000 (02:54 +0800)
committerStéphane Graber <stgraber@ubuntu.com>
Mon, 30 Jun 2014 16:33:20 +0000 (12:33 -0400)
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 <alexander.idkfa.vladimirov@gmail.com>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
src/lxc/confile.c

index 47b285e30ccf3b4d1b8421180ec253aeb08bc3ff..b5e37665631bdcd591d9b5a62727f557858296e3 100644 (file)
@@ -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;