[lxc-devel] [PATCH 2/2] monitor: fix sockname calculation for long lxcpaths

Stéphane Graber stgraber at ubuntu.com
Mon Aug 18 03:36:58 UTC 2014


On Sat, Aug 09, 2014 at 12:30:12AM +0000, Serge Hallyn wrote:
> A long enough lxcpath (and small PATH_MAX through crappy defines) can cause
> the creation of the string to be hashed to fail.  So just use alloca to
> get the size string we need.
> 
> More importantly, while I can't explain it, if lxcpath is too long, setting
> sockname[sizeof(addr->sun_path)-2] to \0 simply doesn't seem to work.  So set
> sockname[sizeof(addr->sun_path)-3] to \0, which does work.
> 
> With this, and with
> 
> lxc.lxcpath = /opt/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789/lxc0123456789
> 
> in /etc/lxc/lxc.conf, I can run lxc-wait just fine.  Without it, it fails
> (as does lxc-start -d, which uses lxc_wait to verify the container started)
> 
> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>

Acked-by: Stéphane Graber <stgraber at ubuntu.com>

> ---
>  src/lxc/monitor.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/src/lxc/monitor.c b/src/lxc/monitor.c
> index 7c6dbb4..59b02b3 100644
> --- a/src/lxc/monitor.c
> +++ b/src/lxc/monitor.c
> @@ -142,7 +142,7 @@ int lxc_monitor_sock_name(const char *lxcpath, struct sockaddr_un *addr) {
>  	size_t len;
>  	int ret;
>  	char *sockname = &addr->sun_path[1];
> -	char path[PATH_MAX+18];
> +	char *path;
>  	uint64_t hash;
>  
>  	/* addr.sun_path is only 108 bytes, so we hash the full name and
> @@ -150,18 +150,20 @@ int lxc_monitor_sock_name(const char *lxcpath, struct sockaddr_un *addr) {
>  	 */
>  	memset(addr, 0, sizeof(*addr));
>  	addr->sun_family = AF_UNIX;
> -	len = sizeof(addr->sun_path) - 1;
> -	ret = snprintf(path, sizeof(path), "lxc/%s/monitor-sock", lxcpath);
> -	if (ret < 0 || ret >= sizeof(path)) {
> -		ERROR("lxcpath %s too long for monitor unix socket", lxcpath);
> +	len = strlen(lxcpath) + 18;
> +	path = alloca(len);
> +	ret = snprintf(path, len, "lxc/%s/monitor-sock", lxcpath);
> +	if (ret < 0 || ret >= len) {
> +		ERROR("memory error creating monitor path");
>  		return -1;
>  	}
>  
> +	len = sizeof(addr->sun_path) - 1;
>  	hash = fnv_64a_buf(path, ret, FNV1A_64_INIT);
>  	ret = snprintf(sockname, len, "lxc/%016" PRIx64 "/%s", hash, lxcpath);
>  	if (ret < 0)
>  		return -1;
> -	sockname[sizeof(addr->sun_path)-2] = '\0';
> +	sockname[sizeof(addr->sun_path)-3] = '\0';
>  	INFO("using monitor sock name %s", sockname);
>  	return 0;
>  }
> -- 
> 2.1.0.rc1
> 
> _______________________________________________
> 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/20140817/74054942/attachment.sig>


More information about the lxc-devel mailing list