diff options
author | Eric Dumazet <edumazet@google.com> | 2015-11-08 13:54:12 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-11-08 20:56:39 -0500 |
commit | 3aed822591556f93169ff532fda8c71b9b596de5 (patch) | |
tree | 584b8fc12bc6ef6c53c676572594eb4ef67f4a29 | |
parent | 02a56c81cf33dea892da1f8a5231b0f7d7e714fe (diff) |
netfilter: nft_meta: use skb_to_full_sk() helper
SYNACK packets might be attached to request sockets.
Fixes: ca6fb0651883 ("tcp: attach SYNACK messages to request sockets instead of listener")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/netfilter/nft_meta.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/net/netfilter/nft_meta.c b/net/netfilter/nft_meta.c index e4ad2c24bc41..9dfaf4d55ee0 100644 --- a/net/netfilter/nft_meta.c +++ b/net/netfilter/nft_meta.c | |||
@@ -31,6 +31,7 @@ void nft_meta_get_eval(const struct nft_expr *expr, | |||
31 | const struct nft_meta *priv = nft_expr_priv(expr); | 31 | const struct nft_meta *priv = nft_expr_priv(expr); |
32 | const struct sk_buff *skb = pkt->skb; | 32 | const struct sk_buff *skb = pkt->skb; |
33 | const struct net_device *in = pkt->in, *out = pkt->out; | 33 | const struct net_device *in = pkt->in, *out = pkt->out; |
34 | struct sock *sk; | ||
34 | u32 *dest = ®s->data[priv->dreg]; | 35 | u32 *dest = ®s->data[priv->dreg]; |
35 | 36 | ||
36 | switch (priv->key) { | 37 | switch (priv->key) { |
@@ -86,33 +87,35 @@ void nft_meta_get_eval(const struct nft_expr *expr, | |||
86 | *(u16 *)dest = out->type; | 87 | *(u16 *)dest = out->type; |
87 | break; | 88 | break; |
88 | case NFT_META_SKUID: | 89 | case NFT_META_SKUID: |
89 | if (skb->sk == NULL || !sk_fullsock(skb->sk)) | 90 | sk = skb_to_full_sk(skb); |
91 | if (!sk || !sk_fullsock(sk)) | ||
90 | goto err; | 92 | goto err; |
91 | 93 | ||
92 | read_lock_bh(&skb->sk->sk_callback_lock); | 94 | read_lock_bh(&sk->sk_callback_lock); |
93 | if (skb->sk->sk_socket == NULL || | 95 | if (sk->sk_socket == NULL || |
94 | skb->sk->sk_socket->file == NULL) { | 96 | sk->sk_socket->file == NULL) { |
95 | read_unlock_bh(&skb->sk->sk_callback_lock); | 97 | read_unlock_bh(&sk->sk_callback_lock); |
96 | goto err; | 98 | goto err; |
97 | } | 99 | } |
98 | 100 | ||
99 | *dest = from_kuid_munged(&init_user_ns, | 101 | *dest = from_kuid_munged(&init_user_ns, |
100 | skb->sk->sk_socket->file->f_cred->fsuid); | 102 | sk->sk_socket->file->f_cred->fsuid); |
101 | read_unlock_bh(&skb->sk->sk_callback_lock); | 103 | read_unlock_bh(&sk->sk_callback_lock); |
102 | break; | 104 | break; |
103 | case NFT_META_SKGID: | 105 | case NFT_META_SKGID: |
104 | if (skb->sk == NULL || !sk_fullsock(skb->sk)) | 106 | sk = skb_to_full_sk(skb); |
107 | if (!sk || !sk_fullsock(sk)) | ||
105 | goto err; | 108 | goto err; |
106 | 109 | ||
107 | read_lock_bh(&skb->sk->sk_callback_lock); | 110 | read_lock_bh(&sk->sk_callback_lock); |
108 | if (skb->sk->sk_socket == NULL || | 111 | if (sk->sk_socket == NULL || |
109 | skb->sk->sk_socket->file == NULL) { | 112 | sk->sk_socket->file == NULL) { |
110 | read_unlock_bh(&skb->sk->sk_callback_lock); | 113 | read_unlock_bh(&sk->sk_callback_lock); |
111 | goto err; | 114 | goto err; |
112 | } | 115 | } |
113 | *dest = from_kgid_munged(&init_user_ns, | 116 | *dest = from_kgid_munged(&init_user_ns, |
114 | skb->sk->sk_socket->file->f_cred->fsgid); | 117 | sk->sk_socket->file->f_cred->fsgid); |
115 | read_unlock_bh(&skb->sk->sk_callback_lock); | 118 | read_unlock_bh(&sk->sk_callback_lock); |
116 | break; | 119 | break; |
117 | #ifdef CONFIG_IP_ROUTE_CLASSID | 120 | #ifdef CONFIG_IP_ROUTE_CLASSID |
118 | case NFT_META_RTCLASSID: { | 121 | case NFT_META_RTCLASSID: { |
@@ -168,9 +171,10 @@ void nft_meta_get_eval(const struct nft_expr *expr, | |||
168 | break; | 171 | break; |
169 | #ifdef CONFIG_CGROUP_NET_CLASSID | 172 | #ifdef CONFIG_CGROUP_NET_CLASSID |
170 | case NFT_META_CGROUP: | 173 | case NFT_META_CGROUP: |
171 | if (skb->sk == NULL || !sk_fullsock(skb->sk)) | 174 | sk = skb_to_full_sk(skb); |
175 | if (!sk || !sk_fullsock(sk)) | ||
172 | goto err; | 176 | goto err; |
173 | *dest = skb->sk->sk_classid; | 177 | *dest = sk->sk_classid; |
174 | break; | 178 | break; |
175 | #endif | 179 | #endif |
176 | default: | 180 | default: |