netfilter: xt_qtaguid: fix bad tcp_time_wait sock handling
Since (41063e9
ipv4: Early TCP socket demux), skb's can have an sk which
is not a struct sock but the smaller struct inet_timewait_sock without an
sk->sk_socket. Now we bypass sk_state == TCP_TIME_WAIT
Signed-off-by: JP Abgrall <jpa@google.com>
This commit is contained in:
parent
81ceb38559
commit
ad5d02a586
1 changed files with 11 additions and 5 deletions
|
@ -1597,14 +1597,13 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Seems to be issues on the file ptr for TCP_TIME_WAIT SKs.
|
||||
* http://kerneltrap.org/mailarchive/linux-netdev/2010/10/21/6287959
|
||||
* Not fixed in 3.0-r3 :(
|
||||
*/
|
||||
if (sk) {
|
||||
MT_DEBUG("qtaguid: %p->sk_proto=%u "
|
||||
"->sk_state=%d\n", sk, sk->sk_protocol, sk->sk_state);
|
||||
/*
|
||||
* When in TCP_TIME_WAIT the sk is not a "struct sock" but
|
||||
* "struct inet_timewait_sock" which is missing fields.
|
||||
*/
|
||||
if (sk->sk_state == TCP_TIME_WAIT) {
|
||||
xt_socket_put_sk(sk);
|
||||
sk = NULL;
|
||||
|
@ -1688,6 +1687,13 @@ static bool qtaguid_mt(const struct sk_buff *skb, struct xt_action_param *par)
|
|||
}
|
||||
|
||||
sk = skb->sk;
|
||||
/*
|
||||
* When in TCP_TIME_WAIT the sk is not a "struct sock" but
|
||||
* "struct inet_timewait_sock" which is missing fields.
|
||||
* So we ignore it.
|
||||
*/
|
||||
if (sk && sk->sk_state == TCP_TIME_WAIT)
|
||||
sk = NULL;
|
||||
if (sk == NULL) {
|
||||
/*
|
||||
* A missing sk->sk_socket happens when packets are in-flight
|
||||
|
|
Loading…
Add table
Reference in a new issue