Skip to content

Commit

Permalink
inet_diag: Introduce socket family checks
Browse files Browse the repository at this point in the history
The new API will specify family to work with. Teach the existing
socket walking code to bypass not interesting ones.

To preserve compatibility with existing behavior the _compat code
sets interesting family to AF_UNSPEC to dump them all.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Pavel Emelyanov authored and David S. Miller committed Dec 6, 2011
1 parent 25c4cd2 commit d23deaa
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion net/ipv4/inet_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,10 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
continue;
}

if (r->sdiag_family != AF_UNSPEC &&
sk->sk_family != r->sdiag_family)
goto next_listen;

if (r->id.idiag_sport != inet->inet_sport &&
r->id.idiag_sport)
goto next_listen;
Expand Down Expand Up @@ -808,6 +812,9 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
goto next_normal;
if (!(r->idiag_states & (1 << sk->sk_state)))
goto next_normal;
if (r->sdiag_family != AF_UNSPEC &&
sk->sk_family != r->sdiag_family)
goto next_normal;
if (r->id.idiag_sport != inet->inet_sport &&
r->id.idiag_sport)
goto next_normal;
Expand All @@ -830,6 +837,9 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,

if (num < s_num)
goto next_dying;
if (r->sdiag_family != AF_UNSPEC &&
tw->tw_family != r->sdiag_family)
goto next_dying;
if (r->id.idiag_sport != tw->tw_sport &&
r->id.idiag_sport)
goto next_dying;
Expand Down Expand Up @@ -873,7 +883,7 @@ static int inet_diag_dump_compat(struct sk_buff *skb, struct netlink_callback *c
struct nlattr *bc = NULL;
int hdrlen = sizeof(struct inet_diag_req_compat);

req.sdiag_family = rc->idiag_family;
req.sdiag_family = AF_UNSPEC; /* compatibility */
req.sdiag_protocol = inet_diag_type2proto(cb->nlh->nlmsg_type);
req.idiag_ext = rc->idiag_ext;
req.idiag_states = rc->idiag_states;
Expand Down

0 comments on commit d23deaa

Please sign in to comment.