From e85898415c28e0467aed3851541e70678ad1688e Mon Sep 17 00:00:00 2001 From: Serge Hallyn Date: Sat, 9 Aug 2014 00:28:18 +0000 Subject: [PATCH] command socket: use hash if needed MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Signed-off-by: Serge Hallyn Acked-by: Stéphane Graber --- 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 458d41e1f..f46efc55f 100644 --- a/src/lxc/commands.c +++ b/src/lxc/commands.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -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.47.2