Hello. On 2016-09-29, 09:02:16, Maxim Dounin wrote: > Thanks for catching this. > > Dropping the length returned by getsockname() doesn't look like > a correct solution though. Instead, teaching ngx_cmp_sockaddr() to > compare sockaddrs with not-completely-filled sun_path - that is, > respecting socklen - should be the right way to go. > > Please try the following patch:
Seems to work OK. Cannot reproduce the problem anymore. Thanks. BTW, wouldn't s/ngx_palloc/ngx_pcalloc/ in ngx_set_inherited_sockets() be prudent anyway? Also, I see your patch is prepared for abstract namespace sockets. Is this feature planned soon? I cobbled up a patch for that (attached) and such sockets now interop with haproxy (abns@ scheme) and socat (with unix-tightsocklen=0). But it probably is not production-ready. -- Jan Seda
commit f2a1919aa7f8f238dcfdac3a4cfad9f2425711d0 Author: Jan Seda <ho...@hodor.cz> Date: Wed Sep 28 21:34:17 2016 +0200 Add support for abstract namespace sockets, format unix:@string diff --git a/src/core/ngx_connection.c b/src/core/ngx_connection.c index fe6e64f..6030c54 100644 --- a/src/core/ngx_connection.c +++ b/src/core/ngx_connection.c @@ -570,12 +570,12 @@ ngx_open_listening_sockets(ngx_cycle_t *cycle) name = ls[i].addr_text.data + sizeof("unix:") - 1; mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); - if (chmod((char *) name, mode) == -1) { + if (name[0] != '@' && chmod((char *) name, mode) == -1) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, "chmod() \"%s\" failed", name); } - if (ngx_test_config) { + if (ngx_test_config && name[0] != '@') { if (ngx_delete_file(name) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno, ngx_delete_file_n " %s failed", name); @@ -1012,7 +1012,7 @@ ngx_close_listening_sockets(ngx_cycle_t *cycle) { u_char *name = ls[i].addr_text.data + sizeof("unix:") - 1; - if (ngx_delete_file(name) == NGX_FILE_ERROR) { + if (name[0] != '@' && ngx_delete_file(name) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, ngx_delete_file_n " %s failed", name); } diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c index 98599f3..9623ae9 100644 --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c @@ -706,7 +706,7 @@ old_shm_zone_done: ngx_log_error(NGX_LOG_WARN, cycle->log, 0, "deleting socket %s", name); - if (ngx_delete_file(name) == NGX_FILE_ERROR) { + if (name[0] != '@' && ngx_delete_file(name) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno, ngx_delete_file_n " %s failed", name); } diff --git a/src/core/ngx_inet.c b/src/core/ngx_inet.c index dbd1f46..4c0b207 100644 --- a/src/core/ngx_inet.c +++ b/src/core/ngx_inet.c @@ -241,7 +241,12 @@ ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len, p = ngx_snprintf(text, len, "unix:%Z"); } else { + if (socklen > ((socklen_t) offsetof(struct sockaddr_un, sun_path) + 1) && + (saun->sun_path[0] == '\0')) { + p = ngx_snprintf(text, len, "unix:@%s%Z", &saun->sun_path[1]); + } else { p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path); + } } /* we do not include trailing zero in address length */ @@ -739,6 +744,9 @@ ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) saun = (struct sockaddr_un *) &u->sockaddr; saun->sun_family = AF_UNIX; (void) ngx_cpystrn((u_char *) saun->sun_path, path, len); + if(saun->sun_path[0] == '@') { + saun->sun_path[0] = '\0'; + } u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t)); if (u->addrs == NULL) { @@ -755,6 +763,9 @@ ngx_parse_unix_domain_url(ngx_pool_t *pool, ngx_url_t *u) saun->sun_family = AF_UNIX; (void) ngx_cpystrn((u_char *) saun->sun_path, path, len); + if(saun->sun_path[0] == '@') { + saun->sun_path[0] = '\0'; + } u->addrs[0].sockaddr = (struct sockaddr *) saun; u->addrs[0].socklen = sizeof(struct sockaddr_un);
_______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel