Mercurial > hg > nginx
comparison src/http/modules/ngx_http_geo_module.c @ 4828:f57154322e0e
Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
(closes #201).
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Thu, 30 Aug 2012 14:58:11 +0000 |
parents | 2ccaaf838bc2 |
children | 9f4cdc7a8578 05beaa2d87b3 |
comparison
equal
deleted
inserted
replaced
4827:6e46016ea276 | 4828:f57154322e0e |
---|---|
231 } | 231 } |
232 | 232 |
233 #if (NGX_HAVE_INET6) | 233 #if (NGX_HAVE_INET6) |
234 | 234 |
235 if (addr.sockaddr->sa_family == AF_INET6) { | 235 if (addr.sockaddr->sa_family == AF_INET6) { |
236 u_char *p; | |
237 in_addr_t inaddr; | |
236 struct in6_addr *inaddr6; | 238 struct in6_addr *inaddr6; |
237 | 239 |
238 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; | 240 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; |
239 | 241 |
240 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { | 242 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
241 return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]); | 243 p = inaddr6->s6_addr; |
244 | |
245 inaddr = p[12] << 24; | |
246 inaddr += p[13] << 16; | |
247 inaddr += p[14] << 8; | |
248 inaddr += p[15]; | |
249 | |
250 return inaddr; | |
242 } | 251 } |
243 } | 252 } |
244 | 253 |
245 #endif | 254 #endif |
246 | 255 |