| .. | .. | 
|---|
|  | 1 | +// SPDX-License-Identifier: GPL-2.0-only | 
|---|
| 1 | 2 | #include <linux/module.h> | 
|---|
| 2 | 3 |  | 
|---|
| 3 | 4 | #include <linux/inet_diag.h> | 
|---|
| .. | .. | 
|---|
| 86 | 87 | return sk ? sk : ERR_PTR(-ENOENT); | 
|---|
| 87 | 88 | } | 
|---|
| 88 | 89 |  | 
|---|
| 89 |  | -static int raw_diag_dump_one(struct sk_buff *in_skb, | 
|---|
| 90 |  | -			     const struct nlmsghdr *nlh, | 
|---|
|  | 90 | +static int raw_diag_dump_one(struct netlink_callback *cb, | 
|---|
| 91 | 91 | const struct inet_diag_req_v2 *r) | 
|---|
| 92 | 92 | { | 
|---|
| 93 |  | -	struct net *net = sock_net(in_skb->sk); | 
|---|
|  | 93 | +	struct sk_buff *in_skb = cb->skb; | 
|---|
| 94 | 94 | struct sk_buff *rep; | 
|---|
| 95 | 95 | struct sock *sk; | 
|---|
|  | 96 | +	struct net *net; | 
|---|
| 96 | 97 | int err; | 
|---|
| 97 | 98 |  | 
|---|
|  | 99 | +	net = sock_net(in_skb->sk); | 
|---|
| 98 | 100 | sk = raw_sock_get(net, r); | 
|---|
| 99 | 101 | if (IS_ERR(sk)) | 
|---|
| 100 | 102 | return PTR_ERR(sk); | 
|---|
| .. | .. | 
|---|
| 108 | 110 | return -ENOMEM; | 
|---|
| 109 | 111 | } | 
|---|
| 110 | 112 |  | 
|---|
| 111 |  | -	err = inet_sk_diag_fill(sk, NULL, rep, r, | 
|---|
| 112 |  | -				sk_user_ns(NETLINK_CB(in_skb).sk), | 
|---|
| 113 |  | -				NETLINK_CB(in_skb).portid, | 
|---|
| 114 |  | -				nlh->nlmsg_seq, 0, nlh, | 
|---|
|  | 113 | +	err = inet_sk_diag_fill(sk, NULL, rep, cb, r, 0, | 
|---|
| 115 | 114 | netlink_net_capable(in_skb, CAP_NET_ADMIN)); | 
|---|
| 116 | 115 | sock_put(sk); | 
|---|
| 117 | 116 |  | 
|---|
| .. | .. | 
|---|
| 136 | 135 | if (!inet_diag_bc_sk(bc, sk)) | 
|---|
| 137 | 136 | return 0; | 
|---|
| 138 | 137 |  | 
|---|
| 139 |  | -	return inet_sk_diag_fill(sk, NULL, skb, r, | 
|---|
| 140 |  | -				 sk_user_ns(NETLINK_CB(cb->skb).sk), | 
|---|
| 141 |  | -				 NETLINK_CB(cb->skb).portid, | 
|---|
| 142 |  | -				 cb->nlh->nlmsg_seq, NLM_F_MULTI, | 
|---|
| 143 |  | -				 cb->nlh, net_admin); | 
|---|
|  | 138 | +	return inet_sk_diag_fill(sk, NULL, skb, cb, r, NLM_F_MULTI, net_admin); | 
|---|
| 144 | 139 | } | 
|---|
| 145 | 140 |  | 
|---|
| 146 | 141 | static void raw_diag_dump(struct sk_buff *skb, struct netlink_callback *cb, | 
|---|
| 147 |  | -			  const struct inet_diag_req_v2 *r, struct nlattr *bc) | 
|---|
|  | 142 | +			  const struct inet_diag_req_v2 *r) | 
|---|
| 148 | 143 | { | 
|---|
| 149 | 144 | bool net_admin = netlink_net_capable(cb->skb, CAP_NET_ADMIN); | 
|---|
| 150 | 145 | struct raw_hashinfo *hashinfo = raw_get_hashinfo(r); | 
|---|
| 151 | 146 | struct net *net = sock_net(skb->sk); | 
|---|
|  | 147 | +	struct inet_diag_dump_data *cb_data; | 
|---|
| 152 | 148 | int num, s_num, slot, s_slot; | 
|---|
| 153 | 149 | struct sock *sk = NULL; | 
|---|
|  | 150 | +	struct nlattr *bc; | 
|---|
| 154 | 151 |  | 
|---|
| 155 | 152 | if (IS_ERR(hashinfo)) | 
|---|
| 156 | 153 | return; | 
|---|
| 157 | 154 |  | 
|---|
|  | 155 | +	cb_data = cb->data; | 
|---|
|  | 156 | +	bc = cb_data->inet_diag_nla_bc; | 
|---|
| 158 | 157 | s_slot = cb->args[0]; | 
|---|
| 159 | 158 | num = s_num = cb->args[1]; | 
|---|
| 160 | 159 |  | 
|---|