]> 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>
Tue, 24 Jun 2014 20:18:33 +0000 (16:18 -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 3462e9c039dc8dba07935884daf93aab63eb6d5a..855b816206a87cc14adf0c183ee65b5518294e62 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) {
@@ -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;