diff options
author | Alejandro Colomar <alx.manpages@gmail.com> | 2022-08-23 23:18:03 +0200 |
---|---|---|
committer | Alejandro Colomar <alx.manpages@gmail.com> | 2022-08-23 23:20:27 +0200 |
commit | 8b845ed61b44a48f7ea7046dfcbee48356c03c77 (patch) | |
tree | e54b19f957bedbdd6f32fcda072d8fdf32029375 | |
parent | 3b522c846ef813316d73c7abc29cb2ad6fbddeb5 (diff) |
Don't add a trailing '\0' for abstract Unix domain sockets.
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.manpages@gmail.com>
Cc: Andrew Clayton <andrew@digital-domain.net>
Cc: Bjornar Ness <bjornar.ness@gmail.com>
-rw-r--r-- | src/core/ngx_inet.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index 0be875a39..4a455e5b7 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 |