Author: arekm                        Date: Sat Aug 22 14:46:32 2009 GMT
Module: packages                      Tag: HEAD
---- Log message:
- rel 0.2; addr selection fixes

---- Files affected:
packages/kernel:
   kernel-vserver-2.3.patch (1.14 -> 1.15) , kernel.spec (1.695 -> 1.696) 

---- Diffs:

================================================================
Index: packages/kernel/kernel-vserver-2.3.patch
diff -u packages/kernel/kernel-vserver-2.3.patch:1.14 
packages/kernel/kernel-vserver-2.3.patch:1.15
--- packages/kernel/kernel-vserver-2.3.patch:1.14       Wed Aug 19 14:30:08 2009
+++ packages/kernel/kernel-vserver-2.3.patch    Sat Aug 22 16:46:26 2009
@@ -26924,3 +26924,83 @@
  #include <linux/parser.h>
  #include <linux/nfs_mount.h>
  #include <net/ipv6.h>
+--- linux-2.6.30.5-vs2.3.0.36.14-pre5.orig/net/ipv6/af_inet6.c 2009-08-22 
00:44:21.295614269 +0200
++++ linux-2.6.30.5-vs2.3.0.36.14-pre5/net/ipv6/af_inet6.c      2009-08-22 
01:26:24.711662351 +0200
+@@ -306,8 +306,14 @@ int inet6_bind(struct socket *sock, stru
+                   v4addr != htonl(INADDR_ANY) &&
+                   chk_addr_ret != RTN_LOCAL &&
+                   chk_addr_ret != RTN_MULTICAST &&
+-                  chk_addr_ret != RTN_BROADCAST)
++                  chk_addr_ret != RTN_BROADCAST) {
++                      err = -EADDRNOTAVAIL;
+                       goto out;
++              }
++              if (!v4_addr_in_nx_info(sk->sk_nx_info, v4addr, NXA_MASK_BIND)) 
{
++                      err = -EADDRNOTAVAIL;
++                      goto out;
++              }
+       } else {
+               if (addr_type != IPV6_ADDR_ANY) {
+                       struct net_device *dev = NULL;
+--- linux-2.6.30.5-vs2.3.0.36.14-pre5.orig/net/ipv6/udp.c      2009-08-21 
22:38:58.139614225 +0200
++++ linux-2.6.30.5-vs2.3.0.36.14-pre5/net/ipv6/udp.c   2009-08-22 
00:39:40.947661415 +0200
+@@ -61,25 +61,44 @@ int ipv6_rcv_saddr_equal(const struct so
+       int addr_type = ipv6_addr_type(sk_rcv_saddr6);
+       int addr_type2 = sk2_rcv_saddr6 ? ipv6_addr_type(sk2_rcv_saddr6) : 
IPV6_ADDR_MAPPED;
+ 
+-      /* if both are mapped, treat as IPv4 */
+-      if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED)
+-              return (!sk2_ipv6only &&
+-                      (!sk_rcv_saddr || !sk2_rcv_saddr ||
+-                        sk_rcv_saddr == sk2_rcv_saddr));
++      if (sk2_ipv6only && !sk2_rcv_saddr6)
++              addr_type2 = IPV6_ADDR_ANY;
+ 
+-      if (addr_type2 == IPV6_ADDR_ANY &&
+-          !(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
+-              return 1;
++      /* if both are mapped or any, treat as IPv4 */
++      if ((addr_type == IPV6_ADDR_MAPPED || (addr_type == IPV6_ADDR_ANY && 
!sk_ipv6only)) &&
++          (addr_type2 == IPV6_ADDR_MAPPED || (addr_type2 == IPV6_ADDR_ANY && 
!sk2_ipv6only))) {
++              if (!sk_rcv_saddr && !sk2_rcv_saddr) {
++                      if (nx_v4_addr_conflict(sk->sk_nx_info, 
sk2->sk_nx_info))
++                              return 1;
++                      else if (addr_type != IPV6_ADDR_ANY && sk2_rcv_saddr6)
++                              return 0;
++                      /* remaining cases are at least one ANY */
++              } else if (!sk_rcv_saddr)
++                      return v4_addr_in_nx_info(sk->sk_nx_info, 
sk2_rcv_saddr, -1);
++              else if (!sk2_rcv_saddr)
++                      return v4_addr_in_nx_info(sk2->sk_nx_info, 
sk_rcv_saddr, -1);
++              else
++                      return (sk_rcv_saddr == sk2_rcv_saddr);
++      }
+ 
+-      if (addr_type == IPV6_ADDR_ANY &&
+-          !(sk_ipv6only && addr_type2 == IPV6_ADDR_MAPPED))
+-              return 1;
++      if (!sk2_rcv_saddr6)
++              addr_type2 = IPV6_ADDR_ANY;
+ 
+-      if (sk2_rcv_saddr6 &&
+-          ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6))
+-              return 1;
++      /* both are IPv6 */
++      if (addr_type == IPV6_ADDR_ANY && addr_type2 == IPV6_ADDR_ANY)
++              return nx_v6_addr_conflict(sk->sk_nx_info, sk2->sk_nx_info);
+ 
+-      return 0;
++      if (addr_type == IPV6_ADDR_ANY) {
++              const struct in6_addr in6_any = {
++                      .s6_addr32 = { 0, 0, 0, 0}
++              };
++              return v6_addr_in_nx_info(sk->sk_nx_info, sk2_rcv_saddr6 ? 
sk2_rcv_saddr6 : &in6_any, -1);
++      }
++
++      if (addr_type2 == IPV6_ADDR_ANY)
++              return v6_addr_in_nx_info(sk2->sk_nx_info, sk_rcv_saddr6, -1);
++
++      return ipv6_addr_equal(sk_rcv_saddr6, sk2_rcv_saddr6);
+ }
+ 
+ int udp_v6_get_port(struct sock *sk, unsigned short snum)

================================================================
Index: packages/kernel/kernel.spec
diff -u packages/kernel/kernel.spec:1.695 packages/kernel/kernel.spec:1.696
--- packages/kernel/kernel.spec:1.695   Thu Aug 20 20:09:26 2009
+++ packages/kernel/kernel.spec Sat Aug 22 16:46:26 2009
@@ -114,7 +114,7 @@
 
 %define                basever         2.6.30
 %define                postver         .5
-%define                rel             0.1
+%define                rel             0.2
 
 %define                _enable_debug_packages                  0
 
@@ -1578,6 +1578,9 @@
 All persons listed below can be reached at <cvs_login>@pld-linux.org
 
 $Log$
+Revision 1.696  2009/08/22 14:46:26  arekm
+- rel 0.2; addr selection fixes
+
 Revision 1.695  2009/08/20 18:09:26  arekm
 - make verbose work again
 
================================================================

---- CVS-web:
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-vserver-2.3.patch?r1=1.14&r2=1.15&f=u
    
http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel.spec?r1=1.695&r2=1.696&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to