mirror of
https://github.com/nginx/nginx.git
synced 2025-06-10 19:42:39 +08:00
fix testing IPv4 address mapped to IPv6, when only IPv6 access rules are defined
This commit is contained in:
parent
529b5f1938
commit
ffc7271250
@ -108,20 +108,30 @@ ngx_http_access_handler(ngx_http_request_t *r)
|
|||||||
{
|
{
|
||||||
struct sockaddr_in *sin;
|
struct sockaddr_in *sin;
|
||||||
ngx_http_access_loc_conf_t *alcf;
|
ngx_http_access_loc_conf_t *alcf;
|
||||||
|
|
||||||
alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);
|
|
||||||
|
|
||||||
#if (NGX_HAVE_INET6)
|
#if (NGX_HAVE_INET6)
|
||||||
|
|
||||||
if (alcf->rules6 && r->connection->sockaddr->sa_family == AF_INET6) {
|
|
||||||
u_char *p;
|
u_char *p;
|
||||||
in_addr_t addr;
|
in_addr_t addr;
|
||||||
struct sockaddr_in6 *sin6;
|
struct sockaddr_in6 *sin6;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
alcf = ngx_http_get_module_loc_conf(r, ngx_http_access_module);
|
||||||
|
|
||||||
|
switch (r->connection->sockaddr->sa_family) {
|
||||||
|
|
||||||
|
case AF_INET:
|
||||||
|
if (alcf->rules) {
|
||||||
|
sin = (struct sockaddr_in *) r->connection->sockaddr;
|
||||||
|
return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
#if (NGX_HAVE_INET6)
|
||||||
|
|
||||||
|
case AF_INET6:
|
||||||
sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
|
sin6 = (struct sockaddr_in6 *) r->connection->sockaddr;
|
||||||
p = sin6->sin6_addr.s6_addr;
|
p = sin6->sin6_addr.s6_addr;
|
||||||
|
|
||||||
if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
|
if (alcf->rules && IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
|
||||||
addr = p[12] << 24;
|
addr = p[12] << 24;
|
||||||
addr += p[13] << 16;
|
addr += p[13] << 16;
|
||||||
addr += p[14] << 8;
|
addr += p[14] << 8;
|
||||||
@ -129,14 +139,11 @@ ngx_http_access_handler(ngx_http_request_t *r)
|
|||||||
return ngx_http_access_inet(r, alcf, htonl(addr));
|
return ngx_http_access_inet(r, alcf, htonl(addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alcf->rules6) {
|
||||||
return ngx_http_access_inet6(r, alcf, p);
|
return ngx_http_access_inet6(r, alcf, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (alcf->rules && r->connection->sockaddr->sa_family == AF_INET) {
|
|
||||||
sin = (struct sockaddr_in *) r->connection->sockaddr;
|
|
||||||
return ngx_http_access_inet(r, alcf, sin->sin_addr.s_addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NGX_DECLINED;
|
return NGX_DECLINED;
|
||||||
|
Loading…
Reference in New Issue
Block a user