]> git.kaiwu.me - nginx.git/commitdiff
Core: keep the length of the local sockaddr.
authorRuslan Ermilov <ru@nginx.com>
Mon, 9 Dec 2013 06:14:51 +0000 (10:14 +0400)
committerRuslan Ermilov <ru@nginx.com>
Mon, 9 Dec 2013 06:14:51 +0000 (10:14 +0400)
src/core/ngx_connection.c
src/core/ngx_connection.h
src/event/ngx_event_accept.c
src/event/ngx_event_acceptex.c

index 4544b294a80299d9c6d3899059aa8625ad0fe9dd..4d73eb3e00e30b98d955fc070d7b4e4167672917 100644 (file)
@@ -1078,12 +1078,15 @@ ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
     struct sockaddr_in6  *sin6;
 #endif
 
+    if (c->local_socklen == 0) {
+        return NGX_ERROR;
+    }
+
     switch (c->local_sockaddr->sa_family) {
 
 #if (NGX_HAVE_INET6)
     case AF_INET6:
         sin6 = (struct sockaddr_in6 *) c->local_sockaddr;
-        len = sizeof(struct sockaddr_in6);
 
         for (addr = 0, i = 0; addr == 0 && i < 16; i++) {
             addr |= sin6->sin6_addr.s6_addr[i];
@@ -1094,7 +1097,6 @@ ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
 
     default: /* AF_INET */
         sin = (struct sockaddr_in *) c->local_sockaddr;
-        len = sizeof(struct sockaddr_in);
         addr = sin->sin_addr.s_addr;
         break;
     }
@@ -1114,13 +1116,16 @@ ngx_connection_local_sockaddr(ngx_connection_t *c, ngx_str_t *s,
         }
 
         ngx_memcpy(c->local_sockaddr, &sa, len);
+
+        c->local_socklen = len;
     }
 
     if (s == NULL) {
         return NGX_OK;
     }
 
-    s->len = ngx_sock_ntop(c->local_sockaddr, len, s->data, s->len, port);
+    s->len = ngx_sock_ntop(c->local_sockaddr, c->local_socklen,
+                           s->data, s->len, port);
 
     return NGX_OK;
 }
index 53149676ecc45eaffde06a79accafa5e70f52fd4..c7b3b315c6296873d8c408b2e23d1e06a5e2a854 100644 (file)
@@ -143,6 +143,7 @@ struct ngx_connection_s {
 #endif
 
     struct sockaddr    *local_sockaddr;
+    socklen_t           local_socklen;
 
     ngx_buf_t          *buffer;
 
index b1145446aa2bdedcbcf9588390e0d6c04e607a3c..e33dce81e05031463f7ea3c5d0b9ef1bf8862c73 100644 (file)
@@ -212,6 +212,7 @@ ngx_event_accept(ngx_event_t *ev)
         c->socklen = socklen;
         c->listening = ls;
         c->local_sockaddr = ls->sockaddr;
+        c->local_socklen = ls->socklen;
 
         c->unexpected_eof = 1;
 
index 1fde03105bfaf5d7fe80d254c610881fe0bcce13..ac511ef77664942d79c5e2f11d8b179261e0b222 100644 (file)
@@ -18,7 +18,6 @@ ngx_event_acceptex(ngx_event_t *rev)
 {
     ngx_listening_t   *ls;
     ngx_connection_t  *c;
-    socklen_t          len;
 
     c = rev->data;
     ls = c->listening;
@@ -50,7 +49,7 @@ ngx_event_acceptex(ngx_event_t *rev)
                              ls->post_accept_buffer_size,
                              ls->socklen + 16,
                              ls->socklen + 16,
-                             &c->local_sockaddr, &len,
+                             &c->local_sockaddr, &c->local_socklen,
                              &c->sockaddr, &c->socklen);
 
     if (ls->post_accept_buffer_size) {