• B
    ipv6: Fix commit 63d9950b (ipv6: Make... · ca6982b8
    Bruno Prémont 提交于
    ipv6: Fix commit 63d9950b (ipv6: Make v4-mapped bindings consistent with IPv4)
    
    Commit 63d9950b
      (ipv6: Make v4-mapped bindings consistent with IPv4)
    changes behavior of inet6_bind() for v4-mapped addresses so it should
    behave the same way as inet_bind().
    
    During this change setting of err to -EADDRNOTAVAIL got lost:
    
    af_inet.c:469 inet_bind()
    	err = -EADDRNOTAVAIL;
    	if (!sysctl_ip_nonlocal_bind &&
    	    !(inet->freebind || inet->transparent) &&
    	    addr->sin_addr.s_addr != htonl(INADDR_ANY) &&
    	    chk_addr_ret != RTN_LOCAL &&
    	    chk_addr_ret != RTN_MULTICAST &&
    	    chk_addr_ret != RTN_BROADCAST)
    		goto out;
    
    
    af_inet6.c:463 inet6_bind()
    	if (addr_type == IPV6_ADDR_MAPPED) {
    		int chk_addr_ret;
    
    		/* Binding to v4-mapped address on a v6-only socket                         
    		 * makes no sense                                                           
    		 */
    		if (np->ipv6only) {
    			err = -EINVAL;
    			goto out; 
    		}
    
    		/* Reproduce AF_INET checks to make the bindings consitant */               
    		v4addr = addr->sin6_addr.s6_addr32[3];                                      
    		chk_addr_ret = inet_addr_type(net, v4addr);                                 
    		if (!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)
    			goto out;
    	} else {
    
    
    Signed-off-by Bruno Prémont <bonbons@linux-vserver.org>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    ca6982b8
af_inet6.c 29.2 KB