Fixed strict aliasing bugs when dealing with IPv4-mapped IPv6 addresses
(closes #201).
Ruslan Ermilov
8 years ago
232 | 232 |
#if (NGX_HAVE_INET6)
|
233 | 233 |
|
234 | 234 |
if (addr.sockaddr->sa_family == AF_INET6) {
|
|
235 |
u_char *p;
|
|
236 |
in_addr_t inaddr;
|
235 | 237 |
struct in6_addr *inaddr6;
|
236 | 238 |
|
237 | 239 |
inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
|
238 | 240 |
|
239 | 241 |
if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
|
240 | |
return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
|
|
242 |
p = inaddr6->s6_addr;
|
|
243 |
|
|
244 |
inaddr = p[12] << 24;
|
|
245 |
inaddr += p[13] << 16;
|
|
246 |
inaddr += p[14] << 8;
|
|
247 |
inaddr += p[15];
|
|
248 |
|
|
249 |
return inaddr;
|
241 | 250 |
}
|
242 | 251 |
}
|
243 | 252 |
|
225 | 225 |
#if (NGX_HAVE_INET6)
|
226 | 226 |
|
227 | 227 |
if (addr.sockaddr->sa_family == AF_INET6) {
|
|
228 |
u_char *p;
|
|
229 |
in_addr_t inaddr;
|
228 | 230 |
struct in6_addr *inaddr6;
|
229 | 231 |
|
230 | 232 |
inaddr6 = &((struct sockaddr_in6 *) addr.sockaddr)->sin6_addr;
|
231 | 233 |
|
232 | 234 |
if (IN6_IS_ADDR_V4MAPPED(inaddr6)) {
|
233 | |
return ntohl(*(in_addr_t *) &inaddr6->s6_addr[12]);
|
|
235 |
p = inaddr6->s6_addr;
|
|
236 |
|
|
237 |
inaddr = p[12] << 24;
|
|
238 |
inaddr += p[13] << 16;
|
|
239 |
inaddr += p[14] << 8;
|
|
240 |
inaddr += p[15];
|
|
241 |
|
|
242 |
return inaddr;
|
234 | 243 |
}
|
235 | 244 |
}
|
236 | 245 |
|