Since '\0' doesn't have a special meaning for abstract Unix domain sockets, the '\0' would be part of the name. This makes it hard to use tools that can handle abstract sockets, such as curl(1) --abstract-unix-sock, since it's not possible to embed a '\0' in a string passed to execve(2).
Signed-off-by: Alejandro Colomar <alx.manpa...@gmail.com> Cc: Andrew Clayton <and...@digital-domain.net> Cc: Bjornar Ness <bjornar.n...@gmail.com> --- src/core/ngx_inet.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 0be875a3..4a455e5b 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -745,7 +745,14 @@ ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) saun = (struct sockaddr_un *) &u->sockaddr; saun->sun_family = AF_UNIX; memcpy(saun->sun_path, path, len - 1); - saun->sun_path[len] = '\0'; + switch (path[0]) { + case '\0': + u->socklen--; + break; + default: + saun->sun_path[len] = '\0'; + break; + } u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t)); if (u->addrs == NULL) { @@ -760,15 +767,22 @@ ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) u->family = AF_UNIX; u->naddrs = 1; - saun->sun_family = AF_UNIX; - memcpy(saun->sun_path, path, len - 1); - saun->sun_path[len] = '\0'; - u->addrs[0].sockaddr = (struct sockaddr *) saun; u->addrs[0].socklen = offsetof(struct sockaddr_un, sun_path) + len; u->addrs[0].name.len = len + 4; u->addrs[0].name.data = u->url.data; + saun->sun_family = AF_UNIX; + memcpy(saun->sun_path, path, len - 1); + switch (path[0]) { + case '\0': + u->addrs[0].socklen--; + break; + default: + saun->sun_path[len] = '\0'; + break; + } + return NGX_OK; #else -- 2.37.2 _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org