[lxc-devel] [PATCH 1/2] command socket: use hash if needed
S.Çağlar Onur
caglar at 10ur.org
Sat Aug 9 01:15:42 UTC 2014
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?
[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
--
S.Çağlar Onur <caglar at 10ur.org>
More information about the lxc-devel
mailing list