[lxc-devel] [PATCH] lxc-copy: cleanup
Serge Hallyn
serge.hallyn at ubuntu.com
Fri Jan 29 18:00:16 UTC 2016
Quoting Christian Brauner (christian.brauner at mailbox.org):
> Signed-off-by: Christian Brauner <christian.brauner at mailbox.org>
So on this free_mnts() thing. If you (as this patch makes it look
like you were risking) run it twice, you'll presumably crash. The
callers always pass in the same global variables. So I think that
(a) free_mnts() should take no arguments and just use the globals,
and then (b) free_mnts() should set mnt_table to NULL and
mnt_table_size = 0.
Does that make sense or am I misreading something?
> ---
> src/lxc/lxc_copy.c | 44 ++++++++++++++++++--------------------------
> 1 file changed, 18 insertions(+), 26 deletions(-)
>
> diff --git a/src/lxc/lxc_copy.c b/src/lxc/lxc_copy.c
> index 9812176..5919bf6 100644
> --- a/src/lxc/lxc_copy.c
> +++ b/src/lxc/lxc_copy.c
> @@ -240,41 +240,36 @@ static int mk_rand_ovl_dirs(struct mnts *mnts, unsigned int num, struct lxc_argu
> char upperdir[MAXPATHLEN];
> char workdir[MAXPATHLEN];
> unsigned int i;
> - int ret = 0;
> - struct mnts *m;
> + int ret;
> + struct mnts *m = NULL;
>
> - for (i = 0; i < num; i++) {
> - m = mnts + i;
> + for (i = 0, m = mnts; i < num; i++, m++) {
> if ((m->mnt_type == LXC_MNT_OVL) || (m->mnt_type == LXC_MNT_AUFS)) {
> ret = snprintf(upperdir, MAXPATHLEN, "%s/%s/delta#XXXXXX",
> arg->newpath, arg->newname);
> if (ret < 0 || ret >= MAXPATHLEN)
> - goto err;
> + return -1;
> if (!mkdtemp(upperdir))
> - goto err;
> + return -1;
> m->upper = strdup(upperdir);
> if (!m->upper)
> - goto err;
> + return -1;
> }
>
> if (m->mnt_type == LXC_MNT_OVL) {
> ret = snprintf(workdir, MAXPATHLEN, "%s/%s/work#XXXXXX",
> arg->newpath, arg->newname);
> if (ret < 0 || ret >= MAXPATHLEN)
> - goto err;
> + return -1;
> if (!mkdtemp(workdir))
> - goto err;
> + return -1;
> m->workdir = strdup(workdir);
> if (!m->workdir)
> - goto err;
> + return -1;
> }
> }
>
> return 0;
> -
> -err:
> - free_mnts(mnt_table, mnt_table_size);
> - return -1;
> }
>
> static char *construct_path(char *path, bool as_prefix)
> @@ -343,7 +338,6 @@ static char *set_mnt_entry(struct mnts *m)
> return mntentry;
>
> err:
> - free_mnts(mnt_table, mnt_table_size);
> free(mntentry);
> return NULL;
> }
> @@ -378,7 +372,6 @@ static int do_clone_ephemeral(struct lxc_container *c,
> int ret = 0;
> bool bret = true;
> struct lxc_container *clone;
> - struct mnts *n;
>
> lxc_attach_options_t attach_options = LXC_ATTACH_OPTIONS_DEFAULT;
> attach_options.env_policy = LXC_ATTACH_CLEAR_ENV;
> @@ -408,13 +401,13 @@ static int do_clone_ephemeral(struct lxc_container *c,
> goto err;
>
> /* allocate and set mount entries */
> - for (i = 0; i < mnt_table_size; i++) {
> + struct mnts *n = NULL;
> + for (i = 0, n = mnt_table; i < mnt_table_size; i++, n++) {
> char *mntentry = NULL;
> - n = mnt_table + i;
> - if ((mntentry = set_mnt_entry(n))) {
> + mntentry = set_mnt_entry(n);
> + if (mntentry)
> bret = clone->set_config_item(clone, "lxc.mount.entry", mntentry);
> - free(mntentry);
> - }
> + free(mntentry);
> if (!mntentry || !bret)
> goto err;
> }
> @@ -432,7 +425,7 @@ static int do_clone_ephemeral(struct lxc_container *c,
> }
>
> if (!clone->start(clone, 0, NULL)) {
> - if (!(clone->lxc_conf->ephemeral == 1))
> + if (clone->lxc_conf->ephemeral != 1)
> goto err;
> goto put;
> }
> @@ -492,17 +485,16 @@ static int do_clone_task(struct lxc_container *c, enum task task, int flags,
> static void free_mnts(struct mnts *m, unsigned int num)
> {
> unsigned int i;
> - struct mnts *n;
> + struct mnts *n = NULL;
>
> - for (i = 0; i < num; i++) {
> - n = m + i;
> + for (i = 0, n = m; i < num; i++, n++) {
> free(n->src);
> free(n->dest);
> free(n->options);
> free(n->upper);
> free(n->workdir);
> }
> - free(m);
> + free(n);
> }
>
> /* we pass fssize in bytes */
> --
> 2.7.0
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
More information about the lxc-devel
mailing list