Signed-off-by: Hannes Frederic Sowa <han...@stressinduktion.org> --- net/ipv6/af_inet6.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 04db40620ea65c..f9367c507573bc 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -316,8 +316,6 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) /* Check if the address belongs to the host. */ if (addr_type == IPV6_ADDR_MAPPED) { - int chk_addr_ret; - /* Binding to v4-mapped address on a v6-only socket * makes no sense */ @@ -326,18 +324,11 @@ int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) goto out; } - /* Reproduce AF_INET checks to make the bindings consistent */ - v4addr = addr->sin6_addr.s6_addr32[3]; - chk_addr_ret = inet_addr_type(net, v4addr); - if (!net->ipv4.sysctl_ip_nonlocal_bind && - !(inet->freebind || inet->transparent) && - v4addr != htonl(INADDR_ANY) && - chk_addr_ret != RTN_LOCAL && - chk_addr_ret != RTN_MULTICAST && - chk_addr_ret != RTN_BROADCAST) { - err = -EADDRNOTAVAIL; + err = inet_allow_bind(sk, addr->sin6_addr.s6_addr32[3]); + if (err < 0) goto out; - } + else + err = 0; } else { if (addr_type != IPV6_ADDR_ANY) { struct net_device *dev = NULL; -- 2.9.3