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

Reply via email to