summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Colomar <alx.manpages@gmail.com>2022-08-23 23:18:03 +0200
committerAlejandro Colomar <alx.manpages@gmail.com>2022-08-23 23:20:27 +0200
commit8b845ed61b44a48f7ea7046dfcbee48356c03c77 (patch)
treee54b19f957bedbdd6f32fcda072d8fdf32029375
parent3b522c846ef813316d73c7abc29cb2ad6fbddeb5 (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.c24
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