]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
clone: clear the rootfs out of unexpanded config
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Wed, 11 Nov 2015 17:13:25 +0000 (17:13 +0000)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 17 Nov 2015 16:38:52 +0000 (11:38 -0500)
Closes #694

When we start cloning container c1 to c2, we first save c1's
configuration in c2's as a starting point.  We long ago cleared
out the lxc.rootfs entry before saving it, so that if we are
killed before we update the rootfs, c2's rootfs doesn't point
to c1's.  Because then lxc-destroy -n c2 would delete c1's rootfs.

But when we introduced the unexpanded_config, we didn't update
this code to clear the rootfs out of the unexpanded_config, which
is what now actually gets saved in write_config().

Do so.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/lxccontainer.c

index 52072553ef4c6be09607995a0986bd4358ac900b..adc29c5cc6e0641d6b3dd8aba532d065716c84cc 100644 (file)
@@ -3057,7 +3057,7 @@ static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char
        struct lxc_container *c2 = NULL;
        char newpath[MAXPATHLEN];
        int ret, storage_copied = 0;
-       char *origroot = NULL;
+       char *origroot = NULL, *saved_unexp_conf = NULL;
        struct clone_update_data data;
        FILE *fout;
        pid_t pid;
@@ -3104,9 +3104,20 @@ static struct lxc_container *do_lxcapi_clone(struct lxc_container *c, const char
                SYSERROR("open %s", newpath);
                goto out;
        }
+
+       saved_unexp_conf = c->lxc_conf->unexpanded_config;
+       c->lxc_conf->unexpanded_config = strdup(saved_unexp_conf);
+       if (!c->lxc_conf->unexpanded_config) {
+               ERROR("Out of memory");
+               goto out;
+       }
+       clear_unexp_config_line(c->lxc_conf, "lxc.rootfs", false);
        write_config(fout, c->lxc_conf);
        fclose(fout);
        c->lxc_conf->rootfs.path = origroot;
+       free(c->lxc_conf->unexpanded_config);
+       c->lxc_conf->unexpanded_config = saved_unexp_conf;
+       saved_unexp_conf = NULL;
 
        sprintf(newpath, "%s/%s/rootfs", lxcpath, newname);
        if (mkdir(newpath, 0755) < 0) {