diff options
Diffstat (limited to 'net/sctp/diag.c')
| -rw-r--r-- | net/sctp/diag.c | 46 | 
1 files changed, 21 insertions, 25 deletions
diff --git a/net/sctp/diag.c b/net/sctp/diag.c index a7d623171501..034e2c74497d 100644 --- a/net/sctp/diag.c +++ b/net/sctp/diag.c @@ -245,48 +245,44 @@ static size_t inet_assoc_attr_size(struct sctp_association *asoc)  		+ 64;  } -static int sctp_tsp_dump_one(struct sctp_transport *tsp, void *p) +static int sctp_sock_dump_one(struct sctp_endpoint *ep, struct sctp_transport *tsp, void *p)  {  	struct sctp_association *assoc = tsp->asoc; -	struct sock *sk = tsp->asoc->base.sk;  	struct sctp_comm_param *commp = p; -	struct sk_buff *in_skb = commp->skb; +	struct sock *sk = ep->base.sk;  	const struct inet_diag_req_v2 *req = commp->r; -	const struct nlmsghdr *nlh = commp->nlh; -	struct net *net = sock_net(in_skb->sk); +	struct sk_buff *skb = commp->skb;  	struct sk_buff *rep;  	int err;  	err = sock_diag_check_cookie(sk, req->id.idiag_cookie);  	if (err) -		goto out; +		return err; -	err = -ENOMEM;  	rep = nlmsg_new(inet_assoc_attr_size(assoc), GFP_KERNEL);  	if (!rep) -		goto out; +		return -ENOMEM;  	lock_sock(sk); -	if (sk != assoc->base.sk) { -		release_sock(sk); -		sk = assoc->base.sk; -		lock_sock(sk); +	if (ep != assoc->ep) { +		err = -EAGAIN; +		goto out;  	} -	err = inet_sctp_diag_fill(sk, assoc, rep, req, -				  sk_user_ns(NETLINK_CB(in_skb).sk), -				  NETLINK_CB(in_skb).portid, -				  nlh->nlmsg_seq, 0, nlh, -				  commp->net_admin); -	release_sock(sk); + +	err = inet_sctp_diag_fill(sk, assoc, rep, req, sk_user_ns(NETLINK_CB(skb).sk), +				  NETLINK_CB(skb).portid, commp->nlh->nlmsg_seq, 0, +				  commp->nlh, commp->net_admin);  	if (err < 0) {  		WARN_ON(err == -EMSGSIZE); -		kfree_skb(rep);  		goto out;  	} +	release_sock(sk); -	err = nlmsg_unicast(net->diag_nlsk, rep, NETLINK_CB(in_skb).portid); +	return nlmsg_unicast(sock_net(skb->sk)->diag_nlsk, rep, NETLINK_CB(skb).portid);  out: +	release_sock(sk); +	kfree_skb(rep);  	return err;  } @@ -429,15 +425,15 @@ static void sctp_diag_get_info(struct sock *sk, struct inet_diag_msg *r,  static int sctp_diag_dump_one(struct netlink_callback *cb,  			      const struct inet_diag_req_v2 *req)  { -	struct sk_buff *in_skb = cb->skb; -	struct net *net = sock_net(in_skb->sk); +	struct sk_buff *skb = cb->skb; +	struct net *net = sock_net(skb->sk);  	const struct nlmsghdr *nlh = cb->nlh;  	union sctp_addr laddr, paddr;  	struct sctp_comm_param commp = { -		.skb = in_skb, +		.skb = skb,  		.r = req,  		.nlh = nlh, -		.net_admin = netlink_net_capable(in_skb, CAP_NET_ADMIN), +		.net_admin = netlink_net_capable(skb, CAP_NET_ADMIN),  	};  	if (req->sdiag_family == AF_INET) { @@ -460,7 +456,7 @@ static int sctp_diag_dump_one(struct netlink_callback *cb,  		paddr.v6.sin6_family = AF_INET6;  	} -	return sctp_transport_lookup_process(sctp_tsp_dump_one, +	return sctp_transport_lookup_process(sctp_sock_dump_one,  					     net, &laddr, &paddr, &commp);  }  | 
