]> git.neil.brown.name Git - history.git/commitdiff
[UDP/TCP]: Fix binding conflict tests wrt. SO_BINDTODEVICE.
authorDavid S. Miller <davem@nuts.ninka.net>
Wed, 8 Oct 2003 01:33:00 +0000 (18:33 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Wed, 8 Oct 2003 01:33:00 +0000 (18:33 -0700)
net/ipv4/tcp_ipv4.c
net/ipv4/udp.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c

index 4529c0f2c8235949b5244e5f134f98365f628fb7..67ec90ce3d05ef5863ca81909434c15c3dc72980 100644 (file)
@@ -188,7 +188,9 @@ static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb)
        sk_for_each_bound(sk2, node, &tb->owners) {
                if (sk != sk2 &&
                    !ipv6_only_sock(sk2) &&
-                   sk->sk_bound_dev_if == sk2->sk_bound_dev_if) {
+                   (!sk->sk_bound_dev_if ||
+                    !sk2->sk_bound_dev_if ||
+                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if)) {
                        if (!reuse || !sk2->sk_reuse ||
                            sk2->sk_state == TCP_LISTEN) {
                                struct inet_opt *inet2 = inet_sk(sk2);
index 2762e0548761412535b03624bc6775b95ebbbe76..c0e4710a18c2ea1e46c374151783ca9c17ceca77 100644 (file)
@@ -176,7 +176,9 @@ gotit:
                        if (inet2->num == snum &&
                            sk2 != sk &&
                            !ipv6_only_sock(sk2) &&
-                           sk2->sk_bound_dev_if == sk->sk_bound_dev_if &&
+                           (!sk2->bound_dev_if ||
+                            !sk->bound_dev_if ||
+                            sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
                            (!inet2->rcv_saddr ||
                             !inet->rcv_saddr ||
                             inet2->rcv_saddr == inet->rcv_saddr) &&
index fc1b3e8837d9f7f17b745965a8073d5265d26d30..0e1ca9018f8ca16bd7d29e99f2571ac6dcf6fd71 100644 (file)
@@ -101,7 +101,10 @@ static inline int tcp_v6_bind_conflict(struct sock *sk,
 
        /* We must walk the whole port owner list in this case. -DaveM */
        sk_for_each_bound(sk2, node, &tb->owners) {
-               if (sk != sk2 && sk->sk_bound_dev_if == sk2->sk_bound_dev_if &&
+               if (sk != sk2 &&
+                   (!sk->sk_bound_dev_if ||
+                    !sk2->sk_bound_dev_if ||
+                    sk->sk_bound_dev_if == sk2->sk_bound_dev_if) &&
                    (!sk->sk_reuse || !sk2->sk_reuse ||
                     sk2->sk_state == TCP_LISTEN) &&
                     ipv6_rcv_saddr_equal(sk, sk2))
index 2ee6d5e55734188b100e8fa6bfe89f8afc9e5619..87f282f2f9cfcb583cfccac9742947b0de1a8048 100644 (file)
@@ -112,7 +112,9 @@ gotit:
                            &udp_hash[snum & (UDP_HTABLE_SIZE - 1)]) {
                        if (inet_sk(sk2)->num == snum &&
                            sk2 != sk &&
-                           sk2->sk_bound_dev_if == sk->sk_bound_dev_if &&
+                           (!sk2->sk_bound_dev_if ||
+                            !sk->sk_bound_dev_if ||
+                            sk2->sk_bound_dev_if == sk->sk_bound_dev_if) &&
                            (!sk2->sk_reuse || !sk->sk_reuse) &&
                            ipv6_rcv_saddr_equal(sk, sk2))
                                goto fail;