mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-07-14 06:06:23 +00:00
command socket: use hash if needed
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 <serge.hallyn@ubuntu.com> Acked-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
parent
da8c55e6ec
commit
e85898415c
@ -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 || ret >= len) {
|
||||
ERROR("Name too long");
|
||||
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("Command socket name too long");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user