[lxc-devel] [PATCH 1/2 v3] Add clone_update_unexp_ovl_paths() function

Christian Brauner christianvanbrauner at gmail.com
Mon Nov 2 17:45:16 UTC 2015


On Nov 2, 2015 6:43 PM, "Serge Hallyn" <serge.hallyn at ubuntu.com> wrote:
>
> Quoting Christian Brauner (christianvanbrauner at gmail.com):
> > On Mon, Nov 02, 2015 at 03:52:25PM +0100, Christian Brauner wrote:
> > > On Mon, Nov 02, 2015 at 02:38:16PM +0000, Serge Hallyn wrote:
> > > > Quoting Christian Brauner (christianvanbrauner at gmail.com):
> > > > > This functions updates absolute paths for overlay upper- and
workdirs so users
> > > > > can simply clone and start new containers without worrying about
absolute paths
> > > > > in lxc.mount.entry overlay entries.
> > > > >
> > > > > Signed-off-by: Christian Brauner <christianvanbrauner at gmail.com>
> > > > > ---
> > > > >  src/lxc/confile.c | 102
++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > > >  src/lxc/confile.h |   3 ++
> > > > >  2 files changed, 105 insertions(+)
> > > > >
> > > > > diff --git a/src/lxc/confile.c b/src/lxc/confile.c
> > > > > index f7d6814..47b0b8b 100644
> > > > > --- a/src/lxc/confile.c
> > > > > +++ b/src/lxc/confile.c
> > > > > @@ -2598,6 +2598,108 @@ void clear_unexp_config_line(struct
lxc_conf *conf, const char *key, bool rm_sub
> > > > >         }
> > > > >  }
> > > > >
> > > > > +bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const
char *oldpath,
> > > > > +                                 const char *newpath, const char
*oldname,
> > > > > +                                 const char *newname, const char
*ovldir)
> > > > > +{
> > > > > +       const char *key = "lxc.mount.entry";
> > > > > +       int ret;
> > > > > +       char *lstart = conf->unexpanded_config;
> > > > > +       char *lend;
> > > > > +       char *p;
> > > > > +       char *q;
> > > > > +       size_t newdirlen = strlen(ovldir) + strlen(newpath) +
strlen(newname) + 2;
> > > > > +       size_t olddirlen = strlen(ovldir) + strlen(oldpath) +
strlen(oldname) + 2;
> > > > > +       char *olddir = alloca(olddirlen + 1);
> > > > > +       char *newdir = alloca(newdirlen + 1);
> > > > > +
> > > > > +       ret = snprintf(olddir, olddirlen + 1, "%s=%s/%s", ovldir,
oldpath, oldname);
> > > > > +       if (ret < 0 || ret >= olddirlen + 1) {
> > > > > +               ERROR("Bug in %s", __func__);
> > > > > +               return false;
> > > > > +       }
> > > > > +       ret = snprintf(newdir, newdirlen + 1, "%s=%s/%s", ovldir,
newpath, newname);
> > > > > +       if (ret < 0 || ret >= newdirlen + 1) {
> > > > > +               ERROR("Bug in %s", __func__);
> > > > > +               return false;
> > > > > +       }
> > > > > +       if (!conf->unexpanded_config)
> > > > > +               return true;
> > > > > +       while (*lstart) {
> > > > > +               lend = strchr(lstart, '\n');
> > > > > +               if (!lend)
> > > > > +                       lend = lstart + strlen(lstart);
> > > > > +               else
> > > > > +                       lend++;
> > > > > +               if (strncmp(lstart, key, strlen(key)) != 0) {
> > > > > +                       lstart = lend;
> > > > > +                       continue;
> > > > > +               }
> > > > > +               p = strchr(lstart + strlen(key), '=');
> > > > > +               if (!p) {
> > > > > +                       lstart = lend;
> > > > > +                       continue;
> > > > > +               }
> > > > > +               p++;
> > > > > +               while (isblank(*p))
> > > > > +                       p++;
> > > > > +               if (p >= lend)
> > > > > +                        continue;
> > > > > +                /* Whenever an lxc.mount.entry entry is found in
a line we check
> > > > > +                *  if the substring " overlay" or the substring
" aufs" is
> > > > > +                *  present before doing any further work. We
check for "
> > > > > +                *  overlay" and " aufs" since both substrings
need to have at
> > > > > +                *  least one space before them in a valid overlay
> > > > > +                *  lxc.mount.entry (/A B overlay).  When the
space before is
> > > > > +                *  missing it is very likely that these
substrings are part of a
> > > > > +                *  path or something else. */
> > > > > +               if (!strstr(p, " overlay") && !strstr(p, "
aufs")) {
> > > > > +                       lstart = lend;
> > > > > +                       continue;
> > > > > +               }
> > > > > +               if (!(q = strstr(p, olddir))) {
> > > > > +                       lstart = lend;
> > > > > +                       continue;
> > > > > +               }
> > > >
> > > > You're still not doing anything to ensure that 'overlays'/'aufs'
and the
> > > > olddir are actually occurring on this same line.  So they could be
showing
> > > > up in a comment or just later line.
> >
> > I don't think this is the case. At the beginning of the while() we
search for a
> > newline character and make lend point to the character immediately
after it.
> >
> >               lend = strchr(lstart, '\n');
> >               if (!lend)
> >                       lend = lstart + strlen(lstart);
> >               else
> >                       lend++;
> >
> > Then we check
> >
> >               if (!strstr(p, " overlay") && !strstr(p, " aufs"))
>
> strstr will not constrain it's search to values under lend (unless you
> set *lend = '\0')
>
> -serge

Searching for my mistake at the total wrong end... I'll fix it later
tonight.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20151102/a825da9e/attachment.html>


More information about the lxc-devel mailing list