diff options
author | Pavel Emelyanov <xemul@parallels.com> | 2011-12-14 21:43:44 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-16 13:48:27 -0500 |
commit | f65c1b534b99aef1809b893387b295963821549f (patch) | |
tree | 0718e1598b4d01c4c1817a3c663a312616f0dddd /net/ipv4/inet_diag.c | |
parent | aec8dc62f66199aef153d86e1f90d9c1d14696e3 (diff) |
sock_diag: Generalize requests cookies managements
The sk address is used as a cookie between dump/get_exact calls.
It will be required for unix socket sdumping, so move it from
inet_diag to sock_diag.
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/inet_diag.c')
-rw-r--r-- | net/ipv4/inet_diag.c | 23 |
1 files changed, 4 insertions, 19 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index fa27313765f3..fb2e47ff59f7 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -102,8 +102,7 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | |||
102 | r->idiag_retrans = 0; | 102 | r->idiag_retrans = 0; |
103 | 103 | ||
104 | r->id.idiag_if = sk->sk_bound_dev_if; | 104 | r->id.idiag_if = sk->sk_bound_dev_if; |
105 | r->id.idiag_cookie[0] = (u32)(unsigned long)sk; | 105 | sock_diag_save_cookie(sk, r->id.idiag_cookie); |
106 | r->id.idiag_cookie[1] = (u32)(((unsigned long)sk >> 31) >> 1); | ||
107 | 106 | ||
108 | r->id.idiag_sport = inet->inet_sport; | 107 | r->id.idiag_sport = inet->inet_sport; |
109 | r->id.idiag_dport = inet->inet_dport; | 108 | r->id.idiag_dport = inet->inet_dport; |
@@ -221,8 +220,7 @@ static int inet_twsk_diag_fill(struct inet_timewait_sock *tw, | |||
221 | r->idiag_family = tw->tw_family; | 220 | r->idiag_family = tw->tw_family; |
222 | r->idiag_retrans = 0; | 221 | r->idiag_retrans = 0; |
223 | r->id.idiag_if = tw->tw_bound_dev_if; | 222 | r->id.idiag_if = tw->tw_bound_dev_if; |
224 | r->id.idiag_cookie[0] = (u32)(unsigned long)tw; | 223 | sock_diag_save_cookie(tw, r->id.idiag_cookie); |
225 | r->id.idiag_cookie[1] = (u32)(((unsigned long)tw >> 31) >> 1); | ||
226 | r->id.idiag_sport = tw->tw_sport; | 224 | r->id.idiag_sport = tw->tw_sport; |
227 | r->id.idiag_dport = tw->tw_dport; | 225 | r->id.idiag_dport = tw->tw_dport; |
228 | r->id.idiag_src[0] = tw->tw_rcv_saddr; | 226 | r->id.idiag_src[0] = tw->tw_rcv_saddr; |
@@ -261,18 +259,6 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, | |||
261 | return inet_csk_diag_fill(sk, skb, r, pid, seq, nlmsg_flags, unlh); | 259 | return inet_csk_diag_fill(sk, skb, r, pid, seq, nlmsg_flags, unlh); |
262 | } | 260 | } |
263 | 261 | ||
264 | int inet_diag_check_cookie(struct sock *sk, struct inet_diag_req *req) | ||
265 | { | ||
266 | if ((req->id.idiag_cookie[0] != INET_DIAG_NOCOOKIE || | ||
267 | req->id.idiag_cookie[1] != INET_DIAG_NOCOOKIE) && | ||
268 | ((u32)(unsigned long)sk != req->id.idiag_cookie[0] || | ||
269 | (u32)((((unsigned long)sk) >> 31) >> 1) != req->id.idiag_cookie[1])) | ||
270 | return -ESTALE; | ||
271 | else | ||
272 | return 0; | ||
273 | } | ||
274 | EXPORT_SYMBOL_GPL(inet_diag_check_cookie); | ||
275 | |||
276 | int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, | 262 | int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_skb, |
277 | const struct nlmsghdr *nlh, struct inet_diag_req *req) | 263 | const struct nlmsghdr *nlh, struct inet_diag_req *req) |
278 | { | 264 | { |
@@ -304,7 +290,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_s | |||
304 | if (sk == NULL) | 290 | if (sk == NULL) |
305 | goto out_nosk; | 291 | goto out_nosk; |
306 | 292 | ||
307 | err = inet_diag_check_cookie(sk, req); | 293 | err = sock_diag_check_cookie(sk, req->id.idiag_cookie); |
308 | if (err) | 294 | if (err) |
309 | goto out; | 295 | goto out; |
310 | 296 | ||
@@ -617,8 +603,7 @@ static int inet_diag_fill_req(struct sk_buff *skb, struct sock *sk, | |||
617 | r->idiag_retrans = req->retrans; | 603 | r->idiag_retrans = req->retrans; |
618 | 604 | ||
619 | r->id.idiag_if = sk->sk_bound_dev_if; | 605 | r->id.idiag_if = sk->sk_bound_dev_if; |
620 | r->id.idiag_cookie[0] = (u32)(unsigned long)req; | 606 | sock_diag_save_cookie(req, r->id.idiag_cookie); |
621 | r->id.idiag_cookie[1] = (u32)(((unsigned long)req >> 31) >> 1); | ||
622 | 607 | ||
623 | tmo = req->expires - jiffies; | 608 | tmo = req->expires - jiffies; |
624 | if (tmo < 0) | 609 | if (tmo < 0) |