[lxc-devel] [PATCH] hash command unix socket name

Stéphane Graber stgraber at ubuntu.com
Wed Feb 19 21:46:06 UTC 2014


On Wed, Feb 19, 2014 at 04:31:38PM -0500, S.Çağlar Onur wrote:
> Signed-off-by: S.Çağlar Onur <caglar at 10ur.org>
> ---
>  src/lxc/commands.c | 33 +++++++++++++++++++++++++++------
>  1 file changed, 27 insertions(+), 6 deletions(-)
> 
> diff --git a/src/lxc/commands.c b/src/lxc/commands.c
> index 6b46c2c..dbfa23e 100644
> --- a/src/lxc/commands.c
> +++ b/src/lxc/commands.c
> @@ -32,6 +32,8 @@
>  #include <sys/param.h>
>  #include <malloc.h>
>  #include <stdlib.h>
> +#include <stdbool.h>
> +#include <inttypes.h>
>  
>  #include "log.h"
>  #include "lxc.h"
> @@ -74,10 +76,12 @@
>  lxc_log_define(lxc_commands, lxc);
>  
>  static int fill_sock_name(char *path, int len, const char *name,
> -			  const char *inpath)
> +			  const char *inpath, bool init)
>  {
> +	char *offset = &path[1];
>  	const char *lxcpath = NULL;
> -	int ret;
> +	uint64_t hash;
> +	int ret, sock;
>  
>  	if (!inpath) {
>  		lxcpath = lxc_global_config_value("lxc.lxcpath");
> @@ -86,12 +90,29 @@ static int fill_sock_name(char *path, int len, const char *name,
>  			return -1;
>  		}
>  	}
> -	ret = snprintf(path, len, "%s/%s/command", lxcpath ? lxcpath : inpath, name);
> -
> +	ret = snprintf(offset, len, "%s/%s/command", lxcpath ? lxcpath : inpath, name);
>  	if (ret < 0 || ret >= len) {
>  		ERROR("Name too long");
>  		return -1;
>  	}

^ So wasn't the whole point of this change to allow for a lxcpath/name
to be bigger than 108 bytes?

If so, the above check will prevent that from working as the path itself
is still constrained by the length passed from the caller.

> +	/* addr.sun_path is only 108 bytes, so we hash the full name */
> +	hash = fnv_64a_buf(path, ret, FNV1A_64_INIT);

So we're hashing the whole thing, not just offset?

> +	ret = snprintf(offset, len, "lxc/command/%016" PRIx64, hash);
> +	if (ret < 0 || ret >= len)
> +		return -1;
> +
> +	/* if caller is not lxc_cmd_init then try connecting to UDS,
> +	 * fallback to the old naming scheme if that fails */
> +	if (!init) {
> +		sock = lxc_abstract_unix_connect(path);
> +		if (sock < 0 && errno == ECONNREFUSED) {
> +			ret = snprintf(offset, len, "%s/%s/command", lxcpath ? lxcpath : inpath, name);
> +			if (ret < 0 || ret >= len) {
> +				return -1;
> +			}
> +		}
> +		close(sock);
> +	}
>  	return 0;
>  }
>  
> @@ -248,7 +269,7 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
>  	*stopped = 0;
>  
>  	len = sizeof(path)-1;
> -	if (fill_sock_name(offset, len, name, lxcpath))
> +	if (fill_sock_name(path, len, name, lxcpath, false))
>  		return -1;
>  
>  	sock = lxc_abstract_unix_connect(path);
> @@ -856,7 +877,7 @@ int lxc_cmd_init(const char *name, struct lxc_handler *handler,
>  	int len;
>  
>  	len = sizeof(path)-1;
> -	if (fill_sock_name(offset, len, name, lxcpath))
> +	if (fill_sock_name(path, len, name, lxcpath, true))
>  		return -1;
>  
>  	fd = lxc_abstract_unix_open(path, SOCK_STREAM, 0);
> -- 
> 1.8.3.2
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140219/53be999b/attachment.pgp>


More information about the lxc-devel mailing list