Mercurial > hg > nginx-quic
comparison src/http/modules/ngx_http_geoip_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 | 95d93f7e6fa2 |
children | a74d211f034d |
comparison
equal
deleted
inserted
replaced
4827:6e46016ea276 | 4828:f57154322e0e |
---|---|
224 } | 224 } |
225 | 225 |
226 #if (NGX_HAVE_INET6) | 226 #if (NGX_HAVE_INET6) |
227 | 227 |
228 if (addr.sockaddr->sa_family == AF_INET6) { | 228 if (addr.sockaddr->sa_family == AF_INET6) { |
229 u_char *p; | |
230 in_addr_t inaddr; | |
229 struct in6_addr *inaddr6; | 231 struct in6_addr *inaddr6; |
230 | 232 |
231 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; | 233 inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr; |
232 | 234 |
233 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { | 235 if (IN6_IS_ADDR_V4MAPPED(inaddr6)) { |
234 return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]); | 236 p = inaddr6->s6_addr; |
237 | |
238 inaddr = p[12] << 24; | |
239 inaddr += p[13] << 16; | |
240 inaddr += p[14] << 8; | |
241 inaddr += p[15]; | |
242 | |
243 return inaddr; | |
235 } | 244 } |
236 } | 245 } |
237 | 246 |
238 #endif | 247 #endif |
239 | 248 |