hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/nfc/netlink.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 * Copyright (C) 2011 Instituto Nokia de Tecnologia
34 *
....@@ -10,19 +11,6 @@
1011 *
1112 * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
1213 * Copyright 2013-2014 Intel Mobile Communications GmbH
13
- *
14
- * This program is free software; you can redistribute it and/or modify
15
- * it under the terms of the GNU General Public License as published by
16
- * the Free Software Foundation; either version 2 of the License, or
17
- * (at your option) any later version.
18
- *
19
- * This program is distributed in the hope that it will be useful,
20
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
- * GNU General Public License for more details.
23
- *
24
- * You should have received a copy of the GNU General Public License
25
- * along with this program; if not, see <http://www.gnu.org/licenses/>.
2614 */
2715
2816 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
....@@ -118,21 +106,14 @@
118106
119107 static struct nfc_dev *__get_device_from_cb(struct netlink_callback *cb)
120108 {
121
- struct nlattr **attrbuf = genl_family_attrbuf(&nfc_genl_family);
109
+ const struct genl_dumpit_info *info = genl_dumpit_info(cb);
122110 struct nfc_dev *dev;
123
- int rc;
124111 u32 idx;
125112
126
- rc = nlmsg_parse(cb->nlh, GENL_HDRLEN + nfc_genl_family.hdrsize,
127
- attrbuf, nfc_genl_family.maxattr, nfc_genl_policy,
128
- NULL);
129
- if (rc < 0)
130
- return ERR_PTR(rc);
131
-
132
- if (!attrbuf[NFC_ATTR_DEVICE_INDEX])
113
+ if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
133114 return ERR_PTR(-EINVAL);
134115
135
- idx = nla_get_u32(attrbuf[NFC_ATTR_DEVICE_INDEX]);
116
+ idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
136117
137118 dev = nfc_get_device(idx);
138119 if (!dev)
....@@ -396,7 +377,7 @@
396377 if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
397378 goto nla_put_failure;
398379
399
- sdp_attr = nla_nest_start(msg, NFC_ATTR_LLC_SDP);
380
+ sdp_attr = nla_nest_start_noflag(msg, NFC_ATTR_LLC_SDP);
400381 if (sdp_attr == NULL) {
401382 rc = -ENOMEM;
402383 goto nla_put_failure;
....@@ -406,7 +387,7 @@
406387 hlist_for_each_entry_safe(sdres, n, sdres_list, node) {
407388 pr_debug("uri: %s, sap: %d\n", sdres->uri, sdres->sap);
408389
409
- uri_attr = nla_nest_start(msg, i++);
390
+ uri_attr = nla_nest_start_noflag(msg, i++);
410391 if (uri_attr == NULL) {
411392 rc = -ENOMEM;
412393 goto nla_put_failure;
....@@ -1058,10 +1039,13 @@
10581039 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
10591040 if (!msg) {
10601041 rc = -ENOMEM;
1061
- goto exit;
1042
+ goto put_local;
10621043 }
10631044
10641045 rc = nfc_genl_send_params(msg, local, info->snd_portid, info->snd_seq);
1046
+
1047
+put_local:
1048
+ nfc_llcp_local_put(local);
10651049
10661050 exit:
10671051 device_unlock(&dev->dev);
....@@ -1124,7 +1108,7 @@
11241108 if (info->attrs[NFC_ATTR_LLC_PARAM_LTO]) {
11251109 if (dev->dep_link_up) {
11261110 rc = -EINPROGRESS;
1127
- goto exit;
1111
+ goto put_local;
11281112 }
11291113
11301114 local->lto = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_LTO]);
....@@ -1135,6 +1119,9 @@
11351119
11361120 if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX])
11371121 local->miux = cpu_to_be16(miux);
1122
+
1123
+put_local:
1124
+ nfc_llcp_local_put(local);
11381125
11391126 exit:
11401127 device_unlock(&dev->dev);
....@@ -1185,12 +1172,13 @@
11851172 tlvs_len = 0;
11861173
11871174 nla_for_each_nested(attr, info->attrs[NFC_ATTR_LLC_SDP], rem) {
1188
- rc = nla_parse_nested(sdp_attrs, NFC_SDP_ATTR_MAX, attr,
1189
- nfc_sdp_genl_policy, info->extack);
1175
+ rc = nla_parse_nested_deprecated(sdp_attrs, NFC_SDP_ATTR_MAX,
1176
+ attr, nfc_sdp_genl_policy,
1177
+ info->extack);
11901178
11911179 if (rc != 0) {
11921180 rc = -EINVAL;
1193
- goto exit;
1181
+ goto put_local;
11941182 }
11951183
11961184 if (!sdp_attrs[NFC_SDP_ATTR_URI])
....@@ -1209,7 +1197,7 @@
12091197 sdreq = nfc_llcp_build_sdreq_tlv(tid, uri, uri_len);
12101198 if (sdreq == NULL) {
12111199 rc = -ENOMEM;
1212
- goto exit;
1200
+ goto put_local;
12131201 }
12141202
12151203 tlvs_len += sdreq->tlv_len;
....@@ -1219,10 +1207,14 @@
12191207
12201208 if (hlist_empty(&sdreq_list)) {
12211209 rc = -EINVAL;
1222
- goto exit;
1210
+ goto put_local;
12231211 }
12241212
12251213 rc = nfc_llcp_send_snl_sdreq(local, &sdreq_list, tlvs_len);
1214
+
1215
+put_local:
1216
+ nfc_llcp_local_put(local);
1217
+
12261218 exit:
12271219 device_unlock(&dev->dev);
12281220
....@@ -1262,7 +1254,7 @@
12621254 struct sk_buff *msg;
12631255 void *hdr;
12641256
1265
- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1257
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
12661258 if (!msg)
12671259 return -ENOMEM;
12681260
....@@ -1278,7 +1270,7 @@
12781270
12791271 genlmsg_end(msg, hdr);
12801272
1281
- genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
1273
+ genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
12821274
12831275 return 0;
12841276
....@@ -1460,8 +1452,12 @@
14601452 rc = dev->ops->se_io(dev, se_idx, apdu,
14611453 apdu_length, cb, cb_context);
14621454
1455
+ device_unlock(&dev->dev);
1456
+ return rc;
1457
+
14631458 error:
14641459 device_unlock(&dev->dev);
1460
+ kfree(cb_context);
14651461 return rc;
14661462 }
14671463
....@@ -1515,6 +1511,7 @@
15151511 u32 dev_idx, se_idx;
15161512 u8 *apdu;
15171513 size_t apdu_len;
1514
+ int rc;
15181515
15191516 if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
15201517 !info->attrs[NFC_ATTR_SE_INDEX] ||
....@@ -1528,25 +1525,37 @@
15281525 if (!dev)
15291526 return -ENODEV;
15301527
1531
- if (!dev->ops || !dev->ops->se_io)
1532
- return -ENOTSUPP;
1528
+ if (!dev->ops || !dev->ops->se_io) {
1529
+ rc = -EOPNOTSUPP;
1530
+ goto put_dev;
1531
+ }
15331532
15341533 apdu_len = nla_len(info->attrs[NFC_ATTR_SE_APDU]);
1535
- if (apdu_len == 0)
1536
- return -EINVAL;
1534
+ if (apdu_len == 0) {
1535
+ rc = -EINVAL;
1536
+ goto put_dev;
1537
+ }
15371538
15381539 apdu = nla_data(info->attrs[NFC_ATTR_SE_APDU]);
1539
- if (!apdu)
1540
- return -EINVAL;
1540
+ if (!apdu) {
1541
+ rc = -EINVAL;
1542
+ goto put_dev;
1543
+ }
15411544
15421545 ctx = kzalloc(sizeof(struct se_io_ctx), GFP_KERNEL);
1543
- if (!ctx)
1544
- return -ENOMEM;
1546
+ if (!ctx) {
1547
+ rc = -ENOMEM;
1548
+ goto put_dev;
1549
+ }
15451550
15461551 ctx->dev_idx = dev_idx;
15471552 ctx->se_idx = se_idx;
15481553
1549
- return nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
1554
+ rc = nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
1555
+
1556
+put_dev:
1557
+ nfc_put_device(dev);
1558
+ return rc;
15501559 }
15511560
15521561 static int nfc_genl_vendor_cmd(struct sk_buff *skb,
....@@ -1569,14 +1578,21 @@
15691578 subcmd = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_SUBCMD]);
15701579
15711580 dev = nfc_get_device(dev_idx);
1572
- if (!dev || !dev->vendor_cmds || !dev->n_vendor_cmds)
1581
+ if (!dev)
15731582 return -ENODEV;
1583
+
1584
+ if (!dev->vendor_cmds || !dev->n_vendor_cmds) {
1585
+ err = -ENODEV;
1586
+ goto put_dev;
1587
+ }
15741588
15751589 if (info->attrs[NFC_ATTR_VENDOR_DATA]) {
15761590 data = nla_data(info->attrs[NFC_ATTR_VENDOR_DATA]);
15771591 data_len = nla_len(info->attrs[NFC_ATTR_VENDOR_DATA]);
1578
- if (data_len == 0)
1579
- return -EINVAL;
1592
+ if (data_len == 0) {
1593
+ err = -EINVAL;
1594
+ goto put_dev;
1595
+ }
15801596 } else {
15811597 data = NULL;
15821598 data_len = 0;
....@@ -1591,10 +1607,14 @@
15911607 dev->cur_cmd_info = info;
15921608 err = cmd->doit(dev, data, data_len);
15931609 dev->cur_cmd_info = NULL;
1594
- return err;
1610
+ goto put_dev;
15951611 }
15961612
1597
- return -EOPNOTSUPP;
1613
+ err = -EOPNOTSUPP;
1614
+
1615
+put_dev:
1616
+ nfc_put_device(dev);
1617
+ return err;
15981618 }
15991619
16001620 /* message building helper */
....@@ -1677,102 +1697,103 @@
16771697 static const struct genl_ops nfc_genl_ops[] = {
16781698 {
16791699 .cmd = NFC_CMD_GET_DEVICE,
1700
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16801701 .doit = nfc_genl_get_device,
16811702 .dumpit = nfc_genl_dump_devices,
16821703 .done = nfc_genl_dump_devices_done,
1683
- .policy = nfc_genl_policy,
16841704 },
16851705 {
16861706 .cmd = NFC_CMD_DEV_UP,
1707
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16871708 .doit = nfc_genl_dev_up,
1688
- .policy = nfc_genl_policy,
16891709 },
16901710 {
16911711 .cmd = NFC_CMD_DEV_DOWN,
1712
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16921713 .doit = nfc_genl_dev_down,
1693
- .policy = nfc_genl_policy,
16941714 },
16951715 {
16961716 .cmd = NFC_CMD_START_POLL,
1717
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
16971718 .doit = nfc_genl_start_poll,
1698
- .policy = nfc_genl_policy,
16991719 },
17001720 {
17011721 .cmd = NFC_CMD_STOP_POLL,
1722
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17021723 .doit = nfc_genl_stop_poll,
1703
- .policy = nfc_genl_policy,
17041724 },
17051725 {
17061726 .cmd = NFC_CMD_DEP_LINK_UP,
1727
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17071728 .doit = nfc_genl_dep_link_up,
1708
- .policy = nfc_genl_policy,
17091729 },
17101730 {
17111731 .cmd = NFC_CMD_DEP_LINK_DOWN,
1732
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17121733 .doit = nfc_genl_dep_link_down,
1713
- .policy = nfc_genl_policy,
17141734 },
17151735 {
17161736 .cmd = NFC_CMD_GET_TARGET,
1737
+ .validate = GENL_DONT_VALIDATE_STRICT |
1738
+ GENL_DONT_VALIDATE_DUMP_STRICT,
17171739 .dumpit = nfc_genl_dump_targets,
17181740 .done = nfc_genl_dump_targets_done,
1719
- .policy = nfc_genl_policy,
17201741 },
17211742 {
17221743 .cmd = NFC_CMD_LLC_GET_PARAMS,
1744
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17231745 .doit = nfc_genl_llc_get_params,
1724
- .policy = nfc_genl_policy,
17251746 },
17261747 {
17271748 .cmd = NFC_CMD_LLC_SET_PARAMS,
1749
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17281750 .doit = nfc_genl_llc_set_params,
1729
- .policy = nfc_genl_policy,
17301751 },
17311752 {
17321753 .cmd = NFC_CMD_LLC_SDREQ,
1754
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17331755 .doit = nfc_genl_llc_sdreq,
1734
- .policy = nfc_genl_policy,
17351756 },
17361757 {
17371758 .cmd = NFC_CMD_FW_DOWNLOAD,
1759
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17381760 .doit = nfc_genl_fw_download,
1739
- .policy = nfc_genl_policy,
17401761 },
17411762 {
17421763 .cmd = NFC_CMD_ENABLE_SE,
1764
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17431765 .doit = nfc_genl_enable_se,
1744
- .policy = nfc_genl_policy,
17451766 },
17461767 {
17471768 .cmd = NFC_CMD_DISABLE_SE,
1769
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17481770 .doit = nfc_genl_disable_se,
1749
- .policy = nfc_genl_policy,
17501771 },
17511772 {
17521773 .cmd = NFC_CMD_GET_SE,
1774
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17531775 .dumpit = nfc_genl_dump_ses,
17541776 .done = nfc_genl_dump_ses_done,
1755
- .policy = nfc_genl_policy,
17561777 },
17571778 {
17581779 .cmd = NFC_CMD_SE_IO,
1780
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17591781 .doit = nfc_genl_se_io,
1760
- .policy = nfc_genl_policy,
17611782 },
17621783 {
17631784 .cmd = NFC_CMD_ACTIVATE_TARGET,
1785
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17641786 .doit = nfc_genl_activate_target,
1765
- .policy = nfc_genl_policy,
17661787 },
17671788 {
17681789 .cmd = NFC_CMD_VENDOR,
1790
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17691791 .doit = nfc_genl_vendor_cmd,
1770
- .policy = nfc_genl_policy,
17711792 },
17721793 {
17731794 .cmd = NFC_CMD_DEACTIVATE_TARGET,
1795
+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
17741796 .doit = nfc_genl_deactivate_target,
1775
- .policy = nfc_genl_policy,
17761797 },
17771798 };
17781799
....@@ -1781,6 +1802,7 @@
17811802 .name = NFC_GENL_NAME,
17821803 .version = NFC_GENL_VERSION,
17831804 .maxattr = NFC_ATTR_MAX,
1805
+ .policy = nfc_genl_policy,
17841806 .module = THIS_MODULE,
17851807 .ops = nfc_genl_ops,
17861808 .n_ops = ARRAY_SIZE(nfc_genl_ops),