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