[lxc-devel] [PATCH 1/2] command socket: use hash if needed

Serge Hallyn serge.hallyn at ubuntu.com
Mon Aug 11 01:26:14 UTC 2014


On Fri, 2014-08-08 at 21:15 -0400, S.Çağlar Onur wrote:
> Hey Serge,
> 
> On Fri, Aug 8, 2014 at 8:28 PM, Serge Hallyn <serge.hallyn at ubuntu.com> wrote:
> > The container command socket is an abstract unix socket containing
> > the lxcpath and container name.  Those can be too long.  In that case,
> > use the hash of the lxcpath and lxcname.  Continue to use the path and
> > name if possible to avoid any back compat issues.
> 
> Last time I tried this [1] I ended up breaking list_active_containers
> as it parses /proc/unix/net, do we still have that problem?

lxc-test-list at least passes with these two patches.

> [1] https://lists.linuxcontainers.org/pipermail/lxc-devel/2014-February/008145.html
> 
> Cheers,
> 
> > Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> > ---
> >  src/lxc/commands.c | 32 +++++++++++++++++++++++++++-----
> >  1 file changed, 27 insertions(+), 5 deletions(-)
> >
> > diff --git a/src/lxc/commands.c b/src/lxc/commands.c
> > index 458d41e..f46efc5 100644
> > --- a/src/lxc/commands.c
> > +++ b/src/lxc/commands.c
> > @@ -28,6 +28,7 @@
> >  #include <fcntl.h>
> >  #include <poll.h>
> >  #include <sys/socket.h>
> > +#include <inttypes.h>
> >  #include <sys/un.h>
> >  #include <sys/param.h>
> >  #include <malloc.h>
> > @@ -74,24 +75,45 @@
> >  lxc_log_define(lxc_commands, lxc);
> >
> >  static int fill_sock_name(char *path, int len, const char *name,
> > -                         const char *inpath)
> > +                         const char *lxcpath)
> >  {
> > -       const char *lxcpath = NULL;
> > +       char *tmppath;
> > +       size_t tmplen;
> > +       uint64_t hash;
> >         int ret;
> >
> > -       if (!inpath) {
> > +       if (!lxcpath) {
> >                 lxcpath = lxc_global_config_value("lxc.lxcpath");
> >                 if (!lxcpath) {
> >                         ERROR("Out of memory getting lxcpath");
> >                         return -1;
> >                 }
> >         }
> > -       ret = snprintf(path, len, "%s/%s/command", lxcpath ? lxcpath : inpath, name);
> > +
> > +       ret = snprintf(path, len, "%s/%s/command", lxcpath, name);
> >
> > +       if (ret < 0) {
> > +               ERROR("Error writing to command sock path");
> > +               return -1;
> > +       }
> > +       if (ret < len)
> > +               return 0;
> > +
> > +       /* ret >= len; lxcpath or name is too long.  hash both */
> > +       tmplen = strlen(name) + strlen(lxcpath) + 2;
> > +       tmppath = alloca(tmplen);
> > +       ret = snprintf(tmppath, tmplen, "%s/%s", lxcpath, name);
> > +       if (ret < 0 || ret >= tmplen) {
> > +               ERROR("memory error");
> > +               return -1;
> > +       }
> > +       hash = fnv_64a_buf(tmppath, ret, FNV1A_64_INIT);
> > +       ret = snprintf(path, len, "lxc/%016" PRIx64 "/cmd_sock", hash);
> >         if (ret < 0 || ret >= len) {
> > -               ERROR("Name too long");
> > +               ERROR("Command socket name too long");
> >                 return -1;
> >         }
> > +
> >         return 0;
> >  }
> >
> > --
> > 2.1.0.rc1
> >
> > _______________________________________________
> > 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