]> git.kaiwu.me - nginx.git/commitdiff
Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
authorRuslan Ermilov <ru@nginx.com>
Thu, 30 Aug 2012 14:58:11 +0000 (14:58 +0000)
committerRuslan Ermilov <ru@nginx.com>
Thu, 30 Aug 2012 14:58:11 +0000 (14:58 +0000)
(closes #201).

src/http/modules/ngx_http_geo_module.c
src/http/modules/ngx_http_geoip_module.c
src/http/ngx_http_core_module.c

index 2308162479d0a348d632559443a060e2824a7918..fce87a8cb46bd558ee8b034a422aa3854adc2b45 100644 (file)
@@ -233,12 +233,21 @@ ngx_http_geo_addr(ngx_http_request_t *r, ngx_http_geo_ctx_t *ctx)
 #if (NGX_HAVE_INET6)
 
     if (addr.sockaddr->sa_family == AF_INET6) {
+        u_char           *p;
+        in_addr_t         inaddr;
         struct in6_addr  *inaddr6;
 
         inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
 
         if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
-            return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
+            p = inaddr6->s6_addr;
+
+            inaddr = p[12] << 24;
+            inaddr += p[13] << 16;
+            inaddr += p[14] << 8;
+            inaddr += p[15];
+
+            return inaddr;
         }
     }
 
index 0ce3bf1e59b6d24526c9ce68b3a7ada33ee63232..7ff4f10fb2a6727f8195324230128e6b1b5d0aa5 100644 (file)
@@ -226,12 +226,21 @@ ngx_http_geoip_addr(ngx_http_request_t *r, ngx_http_geoip_conf_t *gcf)
 #if (NGX_HAVE_INET6)
 
     if (addr.sockaddr->sa_family == AF_INET6) {
+        u_char           *p;
+        in_addr_t         inaddr;
         struct in6_addr  *inaddr6;
 
         inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
 
         if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
-            return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
+            p = inaddr6->s6_addr;
+
+            inaddr = p[12] << 24;
+            inaddr += p[13] << 16;
+            inaddr += p[14] << 8;
+            inaddr += p[15];
+
+            return inaddr;
         }
     }
 
index 5ab9453daf4af907675750f6d8bdcb861cf0cc3b..826e4e5b5cf809db971e5b6dfd53651365d3375a 100644 (file)
@@ -2776,7 +2776,15 @@ ngx_http_get_forwarded_addr(ngx_http_request_t *r, ngx_addr_t *addr,
 
         if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
             family = AF_INET;
-            inaddr = *(in_addr_t *) &inaddr6->s6_addr[12];
+
+            p = inaddr6->s6_addr;
+
+            inaddr = p[12] << 24;
+            inaddr += p[13] << 16;
+            inaddr += p[14] << 8;
+            inaddr += p[15];
+
+            inaddr = htonl(inaddr);
         }
     }
 #endif