aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/inet_diag.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@parallels.com>2011-12-06 02:59:15 -0500
committerDavid S. Miller <davem@davemloft.net>2011-12-06 13:58:02 -0500
commitd23deaa07b9b788e781a2253672cdc8b65b85e53 (patch)
tree14c83ea2a3b804a39a3e19626c1dc349b6f12b8d /net/ipv4/inet_diag.c
parent25c4cd2b6dfd8e3d8efd8e85f167b66c032b80d9 (diff)
inet_diag: Introduce socket family checks
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>
Diffstat (limited to 'net/ipv4/inet_diag.c')
-rw-r--r--net/ipv4/inet_diag.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index 57a1bd97ea35..2642f317af8f 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -743,6 +743,10 @@ static int __inet_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
743 continue; 743 continue;
744 } 744 }
745 745
746 if (r->sdiag_family != AF_UNSPEC &&
747 sk->sk_family != r->sdiag_family)
748 goto next_listen;
749
746 if (r->id.idiag_sport != inet->inet_sport && 750 if (r->id.idiag_sport != inet->inet_sport &&
747 r->id.idiag_sport) 751 r->id.idiag_sport)
748 goto next_listen; 752 goto next_listen;
@@ -808,6 +812,9 @@ skip_listen_ht:
808 goto next_normal; 812 goto next_normal;
809 if (!(r->idiag_states & (1 << sk->sk_state))) 813 if (!(r->idiag_states & (1 << sk->sk_state)))
810 goto next_normal; 814 goto next_normal;
815 if (r->sdiag_family != AF_UNSPEC &&
816 sk->sk_family != r->sdiag_family)
817 goto next_normal;
811 if (r->id.idiag_sport != inet->inet_sport && 818 if (r->id.idiag_sport != inet->inet_sport &&
812 r->id.idiag_sport) 819 r->id.idiag_sport)
813 goto next_normal; 820 goto next_normal;
@@ -830,6 +837,9 @@ next_normal:
830 837
831 if (num < s_num) 838 if (num < s_num)
832 goto next_dying; 839 goto next_dying;
840 if (r->sdiag_family != AF_UNSPEC &&
841 tw->tw_family != r->sdiag_family)
842 goto next_dying;
833 if (r->id.idiag_sport != tw->tw_sport && 843 if (r->id.idiag_sport != tw->tw_sport &&
834 r->id.idiag_sport) 844 r->id.idiag_sport)
835 goto next_dying; 845 goto next_dying;
@@ -873,7 +883,7 @@ static int inet_diag_dump_compat(struct sk_buff *skb, struct netlink_callback *c
873 struct nlattr *bc = NULL; 883 struct nlattr *bc = NULL;
874 int hdrlen = sizeof(struct inet_diag_req_compat); 884 int hdrlen = sizeof(struct inet_diag_req_compat);
875 885
876 req.sdiag_family = rc->idiag_family; 886 req.sdiag_family = AF_UNSPEC; /* compatibility */
877 req.sdiag_protocol = inet_diag_type2proto(cb->nlh->nlmsg_type); 887 req.sdiag_protocol = inet_diag_type2proto(cb->nlh->nlmsg_type);
878 req.idiag_ext = rc->idiag_ext; 888 req.idiag_ext = rc->idiag_ext;
879 req.idiag_states = rc->idiag_states; 889 req.idiag_states = rc->idiag_states;