net: make sock diag per-namespace
[firefly-linux-kernel-4.4.55.git] / net / unix / diag.c
index a74864eedfcd802cbe761ca177e25b2d0d3ead04..750b13408449ac018b3d8ca1bad4def492ffaea6 100644 (file)
@@ -177,6 +177,7 @@ static int unix_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
 {
        struct unix_diag_req *req;
        int num, s_num, slot, s_slot;
+       struct net *net = sock_net(skb->sk);
 
        req = nlmsg_data(cb->nlh);
 
@@ -192,6 +193,8 @@ static int unix_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
 
                num = 0;
                sk_for_each(sk, node, &unix_socket_table[slot]) {
+                       if (!net_eq(sock_net(sk), net))
+                               continue;
                        if (num < s_num)
                                goto next;
                        if (!(req->udiag_states & (1 << sk->sk_state)))
@@ -243,6 +246,7 @@ static int unix_diag_get_exact(struct sk_buff *in_skb,
        struct sock *sk;
        struct sk_buff *rep;
        unsigned int extra_len;
+       struct net *net = sock_net(in_skb->sk);
 
        if (req->udiag_ino == 0)
                goto out_nosk;
@@ -273,7 +277,7 @@ again:
 
                goto again;
        }
-       err = netlink_unicast(sock_diag_nlsk, rep, NETLINK_CB(in_skb).pid,
+       err = netlink_unicast(net->diag_nlsk, rep, NETLINK_CB(in_skb).pid,
                              MSG_DONTWAIT);
        if (err > 0)
                err = 0;
@@ -287,6 +291,7 @@ out_nosk:
 static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
 {
        int hdrlen = sizeof(struct unix_diag_req);
+       struct net *net = sock_net(skb->sk);
 
        if (nlmsg_len(h) < hdrlen)
                return -EINVAL;
@@ -295,7 +300,7 @@ static int unix_diag_handler_dump(struct sk_buff *skb, struct nlmsghdr *h)
                struct netlink_dump_control c = {
                        .dump = unix_diag_dump,
                };
-               return netlink_dump_start(sock_diag_nlsk, skb, h, &c);
+               return netlink_dump_start(net->diag_nlsk, skb, h, &c);
        } else
                return unix_diag_get_exact(skb, h, nlmsg_data(h));
 }