]> git.neil.brown.name Git - history.git/commitdiff
[TCP/IPV4]: Fix tcp_tw_bucket accessed as a sock in tcp_bind_conflict().
authorArnaldo Carvalho de Melo <acme@conectiva.com.br>
Wed, 15 Oct 2003 15:11:33 +0000 (08:11 -0700)
committerDavid S. Miller <davem@nuts.ninka.net>
Wed, 15 Oct 2003 15:11:33 +0000 (08:11 -0700)
net/ipv4/tcp_ipv4.c

index aead9ac9a237dd90379dacf70b785e78ab787b49..357727193da872d8827e9fdcd04061c5402cfd34 100644 (file)
@@ -178,9 +178,15 @@ void tcp_bind_hash(struct sock *sk, struct tcp_bind_bucket *tb,
        tcp_sk(sk)->bind_hash = tb;
 }
 
+static inline const u32 tcp_v4_rcv_saddr(const struct sock *sk)
+{
+       return likely(sk->sk_state != TCP_TIME_WAIT) ?
+               inet_sk(sk)->rcv_saddr : tcptw_sk(sk)->tw_rcv_saddr;
+}
+
 static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb)
 {
-       struct inet_opt *inet = inet_sk(sk);
+       const u32 sk_rcv_saddr = tcp_v4_rcv_saddr(sk);
        struct sock *sk2;
        struct hlist_node *node;
        int reuse = sk->sk_reuse;
@@ -193,9 +199,9 @@ static inline int tcp_bind_conflict(struct sock *sk, struct tcp_bind_bucket *tb)
                     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);
-                               if (!inet2->rcv_saddr || !inet->rcv_saddr ||
-                                   inet2->rcv_saddr == inet->rcv_saddr)
+                               const u32 sk2_rcv_saddr = tcp_v4_rcv_saddr(sk2);
+                               if (!sk2_rcv_saddr || !sk_rcv_saddr ||
+                                   sk2_rcv_saddr == sk_rcv_saddr)
                                        break;
                        }
                }