summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@nuts.ninka.net>2003-05-28 05:11:37 -0700
committerDavid S. Miller <davem@nuts.ninka.net>2003-05-28 05:11:37 -0700
commit205d4b20061528034755abc166b5ac2b23f79a40 (patch)
treedfd28a689bf8ca936ef1717852bbf307300908e1 /include
parent5680d22782a89c665848605c561d1e91ac2b30bc (diff)
[TCP]: Do not access inet_sk() of a time-wait bucket.
Bug discovered by Mandred Spraul.
Diffstat (limited to 'include')
-rw-r--r--include/net/tcp.h13
1 files changed, 12 insertions, 1 deletions
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 158ee68198b4..afc40c419be0 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -208,6 +208,8 @@ struct tcp_tw_bucket {
#endif
};
+#define tcptw_sk(__sk) ((struct tcp_tw_bucket *)(__sk))
+
extern kmem_cache_t *tcp_timewait_cachep;
static inline void tcp_tw_put(struct tcp_tw_bucket *tw)
@@ -246,7 +248,11 @@ extern void tcp_tw_deschedule(struct tcp_tw_bucket *tw);
#endif /* __BIG_ENDIAN */
#define TCP_IPV4_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\
(((*((__u64 *)&(inet_sk(__sk)->daddr)))== (__cookie)) && \
- ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \
+ ((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \
+ (!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
+#define TCP_IPV4_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\
+ (((*((__u64 *)&(tcptw_sk(__sk)->daddr)))== (__cookie)) && \
+ ((*((__u32 *)&(tcptw_sk(__sk)->dport)))== (__ports)) && \
(!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
#else /* 32-bit arch */
#define TCP_V4_ADDR_COOKIE(__name, __saddr, __daddr)
@@ -255,6 +261,11 @@ extern void tcp_tw_deschedule(struct tcp_tw_bucket *tw);
(inet_sk(__sk)->rcv_saddr == (__daddr)) && \
((*((__u32 *)&(inet_sk(__sk)->dport)))== (__ports)) && \
(!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
+#define TCP_IPV4_TW_MATCH(__sk, __cookie, __saddr, __daddr, __ports, __dif)\
+ ((tcptw_sk(__sk)->daddr == (__saddr)) && \
+ (tcptw_sk(__sk)->rcv_saddr == (__daddr)) && \
+ ((*((__u32 *)&(tcptw_sk(__sk)->dport)))== (__ports)) && \
+ (!((__sk)->bound_dev_if) || ((__sk)->bound_dev_if == (__dif))))
#endif /* 64-bit arch */
#define TCP_IPV6_MATCH(__sk, __saddr, __daddr, __ports, __dif) \