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 --- |