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 <[email protected]>
---
 src/lxc/confile.c | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 3462e9c..855b816 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;
-- 
2.0.0

_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to