<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>