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