inet_diag.c (0ea8a56de21be24cb79abb03dee79aabcd60a316) inet_diag.c (d5e4d0a5e692a942f0c212e37dc6aeac47ecbdea)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * inet_diag.c Module for monitoring INET transport protocols sockets.
4 *
5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
6 */
7
8#include <linux/kernel.h>

--- 172 unchanged lines hidden (view full) ---

181 r->idiag_inode = sock_i_ino(sk);
182
183 return 0;
184errout:
185 return 1;
186}
187EXPORT_SYMBOL_GPL(inet_diag_msg_attrs_fill);
188
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * inet_diag.c Module for monitoring INET transport protocols sockets.
4 *
5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
6 */
7
8#include <linux/kernel.h>

--- 172 unchanged lines hidden (view full) ---

181 r->idiag_inode = sock_i_ino(sk);
182
183 return 0;
184errout:
185 return 1;
186}
187EXPORT_SYMBOL_GPL(inet_diag_msg_attrs_fill);
188
189static void inet_diag_parse_attrs(const struct nlmsghdr *nlh, int hdrlen,
190 struct nlattr **req_nlas)
189static int inet_diag_parse_attrs(const struct nlmsghdr *nlh, int hdrlen,
190 struct nlattr **req_nlas)
191{
192 struct nlattr *nla;
193 int remaining;
194
195 nlmsg_for_each_attr(nla, nlh, hdrlen, remaining) {
196 int type = nla_type(nla);
197
191{
192 struct nlattr *nla;
193 int remaining;
194
195 nlmsg_for_each_attr(nla, nlh, hdrlen, remaining) {
196 int type = nla_type(nla);
197
198 if (type == INET_DIAG_REQ_PROTOCOL && nla_len(nla) != sizeof(u32))
199 return -EINVAL;
200
198 if (type < __INET_DIAG_REQ_MAX)
199 req_nlas[type] = nla;
200 }
201 if (type < __INET_DIAG_REQ_MAX)
202 req_nlas[type] = nla;
203 }
204 return 0;
201}
202
203static int inet_diag_get_protocol(const struct inet_diag_req_v2 *req,
204 const struct inet_diag_dump_data *data)
205{
206 if (data->req_nlas[INET_DIAG_REQ_PROTOCOL])
207 return nla_get_u32(data->req_nlas[INET_DIAG_REQ_PROTOCOL]);
208 return req->sdiag_protocol;

--- 360 unchanged lines hidden (view full) ---

569 int hdrlen,
570 const struct inet_diag_req_v2 *req)
571{
572 const struct inet_diag_handler *handler;
573 struct inet_diag_dump_data dump_data;
574 int err, protocol;
575
576 memset(&dump_data, 0, sizeof(dump_data));
205}
206
207static int inet_diag_get_protocol(const struct inet_diag_req_v2 *req,
208 const struct inet_diag_dump_data *data)
209{
210 if (data->req_nlas[INET_DIAG_REQ_PROTOCOL])
211 return nla_get_u32(data->req_nlas[INET_DIAG_REQ_PROTOCOL]);
212 return req->sdiag_protocol;

--- 360 unchanged lines hidden (view full) ---

573 int hdrlen,
574 const struct inet_diag_req_v2 *req)
575{
576 const struct inet_diag_handler *handler;
577 struct inet_diag_dump_data dump_data;
578 int err, protocol;
579
580 memset(&dump_data, 0, sizeof(dump_data));
577 inet_diag_parse_attrs(nlh, hdrlen, dump_data.req_nlas);
581 err = inet_diag_parse_attrs(nlh, hdrlen, dump_data.req_nlas);
582 if (err)
583 return err;
584
578 protocol = inet_diag_get_protocol(req, &dump_data);
579
580 handler = inet_diag_lock_handler(protocol);
581 if (IS_ERR(handler)) {
582 err = PTR_ERR(handler);
583 } else if (cmd == SOCK_DIAG_BY_FAMILY) {
584 struct netlink_callback cb = {
585 .nlh = nlh,

--- 589 unchanged lines hidden (view full) ---

1175 struct sk_buff *skb = cb->skb;
1176 struct nlattr *nla;
1177 int err;
1178
1179 cb_data = kzalloc(sizeof(*cb_data), GFP_KERNEL);
1180 if (!cb_data)
1181 return -ENOMEM;
1182
585 protocol = inet_diag_get_protocol(req, &dump_data);
586
587 handler = inet_diag_lock_handler(protocol);
588 if (IS_ERR(handler)) {
589 err = PTR_ERR(handler);
590 } else if (cmd == SOCK_DIAG_BY_FAMILY) {
591 struct netlink_callback cb = {
592 .nlh = nlh,

--- 589 unchanged lines hidden (view full) ---

1182 struct sk_buff *skb = cb->skb;
1183 struct nlattr *nla;
1184 int err;
1185
1186 cb_data = kzalloc(sizeof(*cb_data), GFP_KERNEL);
1187 if (!cb_data)
1188 return -ENOMEM;
1189
1183 inet_diag_parse_attrs(nlh, hdrlen, cb_data->req_nlas);
1184
1190 err = inet_diag_parse_attrs(nlh, hdrlen, cb_data->req_nlas);
1191 if (err) {
1192 kfree(cb_data);
1193 return err;
1194 }
1185 nla = cb_data->inet_diag_nla_bc;
1186 if (nla) {
1187 err = inet_diag_bc_audit(nla, skb);
1188 if (err) {
1189 kfree(cb_data);
1190 return err;
1191 }
1192 }

--- 260 unchanged lines hidden ---
1195 nla = cb_data->inet_diag_nla_bc;
1196 if (nla) {
1197 err = inet_diag_bc_audit(nla, skb);
1198 if (err) {
1199 kfree(cb_data);
1200 return err;
1201 }
1202 }

--- 260 unchanged lines hidden ---