]> git.kaiwu.me - nginx.git/commitdiff
fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
authorIgor Sysoev <igor@sysoev.ru>
Mon, 16 May 2011 14:01:23 +0000 (14:01 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Mon, 16 May 2011 14:01:23 +0000 (14:01 +0000)
src/http/modules/ngx_http_access_module.c

index bfc36e9bf78d74c7ead03c15d977d2bafd6f6e8e..a28ebf7b7897c1b1e215fa7eafce9559f6e00bb1 100644 (file)
@@ -108,20 +108,30 @@ ngx_http_access_handler(ngx_http_request_t *r)
 {
     struct sockaddr_in          *sin;
     ngx_http_access_loc_conf_t  *alcf;
+#if (NGX_HAVE_INET6)
+    u_char                      *p;
+    in_addr_t                    addr;
+    struct sockaddr_in6         *sin6;
+#endif
 
     alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);
 
-#if (NGX_HAVE_INET6)
+    switch (r->connection->sockaddr->sa_family) {
+
+    case AF_INET:
+        if (alcf->rules) {
+            sin = (struct sockaddr_in *) r->connection->sockaddr;
+            return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);
+        }
+        break;
 
-    if (alcf->rules6 && r->connection->sockaddr->sa_family == AF_INET6) {
-        u_char               *p;
-        in_addr_t             addr;
-        struct sockaddr_in6  *sin6;
+#if (NGX_HAVE_INET6)
 
+    case AF_INET6:
         sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
         p = sin6->sin6_addr.s6_addr;
 
-        if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
+        if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
             addr = p[12] << 24;
             addr += p[13] << 16;
             addr += p[14] << 8;
@@ -129,14 +139,11 @@ ngx_http_access_handler(ngx_http_request_t *r)
             return ngx_http_access_inet(r, alcf, htonl(addr));
         }
 
-        return ngx_http_access_inet6(r, alcf, p);
-    }
+        if (alcf->rules6) {
+            return ngx_http_access_inet6(r, alcf, p);
+        }
 
 #endif
-
-    if (alcf->rules && r->connection->sockaddr->sa_family == AF_INET) {
-        sin = (struct sockaddr_in *) r->connection->sockaddr;
-        return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);
     }
 
     return NGX_DECLINED;