We were calling save_config() twice within the create() flow, each
from a different process. Depending on order of scheduling, sometimes
the data from the first save_config() (which was just the stuff from
LXC_DEFAULT_CONFIG) would overwrite the config we wanted (the full
config), causing a truncated config file which would then cause lxc
to segfault once it read it back in because no rootfs.path was set.

This fixes it by only calling save_config() once in the create()
flow. A rejected alternative was to call fsync(fileno(fout)) before
the fclose in save_config.

Signed-off-by: Dwight Engen <dwight.en...@oracle.com>
---
 src/lxc/lxccontainer.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index c7b2f5e..05ca643 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -1192,16 +1192,19 @@ static bool lxcapi_create(struct lxc_container *c, 
const char *t,
        if (lxcapi_is_defined(c) && c->lxc_conf && c->lxc_conf->rootfs.path &&
                        access(c->lxc_conf->rootfs.path, F_OK) == 0 && tpath) {
                ERROR("Container %s:%s already exists", c->config_path, 
c->name);
-               free(tpath);
-               return false;
+               goto free_tpath;
        }
 
-       /* Save the loaded configuration to disk */
-       if (!c->save_config(c, NULL)) {
-               ERROR("failed to save starting configuration for %s\n", 
c->name);
-               goto out;
+       if (!c->lxc_conf) {
+               if (!c->load_config(c, LXC_DEFAULT_CONFIG)) {
+                       ERROR("Error loading default configuration file %s\n", 
LXC_DEFAULT_CONFIG);
+                       goto free_tpath;
+               }
        }
 
+       if (!create_container_dir(c))
+               goto free_tpath;
+
        /*
         * either template or rootfs.path should be set.
         * if both template and rootfs.path are set, template is setup as 
rootfs.path.
@@ -1290,10 +1293,11 @@ out_unlock:
        if (partial_fd >= 0)
                remove_partial(c, partial_fd);
 out:
-       if (tpath)
-               free(tpath);
        if (!ret && c)
                lxcapi_destroy(c);
+free_tpath:
+       if (tpath)
+               free(tpath);
        return ret;
 }
 
-- 
1.8.3.1


------------------------------------------------------------------------------
DreamFactory - Open Source REST & JSON Services for HTML5 & Native Apps
OAuth, Users, Roles, SQL, NoSQL, BLOB Storage and External API Access
Free app hosting. Or install the open source package on any LAMP server.
Sign up and see examples for AngularJS, jQuery, Sencha Touch and Native!
http://pubads.g.doubleclick.net/gampad/clk?id=63469471&iu=/4140/ostg.clktrk
_______________________________________________
Lxc-devel mailing list
Lxc-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/lxc-devel

Reply via email to