diff src/core/ngx_inet.c @ 676:bfa81a0490a2 NGINX_1_3_1

nginx 1.3.1 *) Security: now nginx/Windows ignores trailing dot in URI path component, and does not allow URIs with ":$" in it. Thanks to Vladimir Kochetkov, Positive Research Center. *) Feature: the "proxy_pass", "fastcgi_pass", "scgi_pass", "uwsgi_pass" directives, and the "server" directive inside the "upstream" block, now support IPv6 addresses. *) Feature: the "resolver" directive now support IPv6 addresses and an optional port specification. *) Feature: the "least_conn" directive inside the "upstream" block. *) Feature: it is now possible to specify a weight for servers while using the "ip_hash" directive. *) Bugfix: a segmentation fault might occur in a worker process if the "image_filter" directive was used; the bug had appeared in 1.3.0. *) Bugfix: nginx could not be built with ngx_cpp_test_module; the bug had appeared in 1.1.12. *) Bugfix: access to variables from SSI and embedded perl module might not work after reconfiguration. Thanks to Yichun Zhang. *) Bugfix: in the ngx_http_xslt_filter_module. Thanks to Kuramoto Eiji. *) Bugfix: memory leak if $geoip_org variable was used. Thanks to Denis F. Latypoff. *) Bugfix: in the "proxy_cookie_domain" and "proxy_cookie_path" directives.
author Igor Sysoev <http://sysoev.ru>
date Tue, 05 Jun 2012 00:00:00 +0400
parents ad45b044f1e5
children 88a1b4797f2e
line wrap: on
line diff
--- a/src/core/ngx_inet.c
+++ b/src/core/ngx_inet.c
@@ -522,11 +522,6 @@ ngx_parse_url(ngx_pool_t *pool, ngx_url_
         return ngx_parse_unix_domain_url(pool, u);
     }
 
-    if ((p[0] == ':' || p[0] == '/') && !u->listen) {
-        u->err = "invalid host";
-        return NGX_ERROR;
-    }
-
     if (p[0] == '[') {
         return ngx_parse_inet6_url(pool, u);
     }
@@ -639,10 +634,7 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx
     args = ngx_strlchr(host, last, '?');
 
     if (args) {
-        if (uri == NULL) {
-            uri = args;
-
-        } else if (args < uri) {
+        if (uri == NULL || args < uri) {
             uri = args;
         }
     }
@@ -668,11 +660,6 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx
 
         len = last - port;
 
-        if (len == 0) {
-            u->err = "invalid port";
-            return NGX_ERROR;
-        }
-
         n = ngx_atoi(port, len);
 
         if (n < 1 || n > 65535) {
@@ -779,11 +766,7 @@ ngx_parse_inet_url(ngx_pool_t *pool, ngx
         return NGX_OK;
     }
 
-    if (ngx_inet_resolve_host(pool, u) != NGX_OK) {
-        return NGX_ERROR;
-    }
-
-    return NGX_OK;
+    return ngx_inet_resolve_host(pool, u);
 }
 
 
@@ -825,6 +808,8 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ng
 
             u->uri.len = last - uri;
             u->uri.data = uri;
+
+            last = uri;
         }
 
         if (*port == ':') {
@@ -832,11 +817,6 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ng
 
             len = last - port;
 
-            if (len == 0) {
-                u->err = "invalid port";
-                return NGX_ERROR;
-            }
-
             n = ngx_atoi(port, len);
 
             if (n < 1 || n > 65535) {
@@ -862,8 +842,8 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ng
         return NGX_ERROR;
     }
 
-    u->host.len = len;
-    u->host.data = host;
+    u->host.len = len + 2;
+    u->host.data = host - 1;
 
     if (ngx_inet6_addr(host, len, sin6->sin6_addr.s6_addr) != NGX_OK) {
         u->err = "invalid IPv6 address";
@@ -874,17 +854,38 @@ ngx_parse_inet6_url(ngx_pool_t *pool, ng
         u->wildcard = 1;
     }
 
-    u->family = AF_INET6;
-
-    if (u->no_resolve) {
-        return NGX_OK;
-    }
-
     if (u->no_port) {
         u->port = u->default_port;
         sin6->sin6_port = htons(u->default_port);
     }
 
+    u->family = AF_INET6;
+    u->naddrs = 1;
+
+    u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t));
+    if (u->addrs == NULL) {
+        return NGX_ERROR;
+    }
+
+    sin6 = ngx_pcalloc(pool, sizeof(struct sockaddr_in6));
+    if (sin6 == NULL) {
+        return NGX_ERROR;
+    }
+
+    ngx_memcpy(sin6, u->sockaddr, sizeof(struct sockaddr_in6));
+
+    u->addrs[0].sockaddr = (struct sockaddr *) sin6;
+    u->addrs[0].socklen = sizeof(struct sockaddr_in6);
+
+    p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1);
+    if (p == NULL) {
+        return NGX_ERROR;
+    }
+
+    u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",
+                                       &u->host, u->port) - p;
+    u->addrs[0].name.data = p;
+
     return NGX_OK;
 
 #else