| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2011 Instituto Nokia de Tecnologia |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 10 | 11 | * |
|---|
| 11 | 12 | * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> |
|---|
| 12 | 13 | * 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/>. |
|---|
| 26 | 14 | */ |
|---|
| 27 | 15 | |
|---|
| 28 | 16 | #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__ |
|---|
| .. | .. |
|---|
| 118 | 106 | |
|---|
| 119 | 107 | static struct nfc_dev *__get_device_from_cb(struct netlink_callback *cb) |
|---|
| 120 | 108 | { |
|---|
| 121 | | - struct nlattr **attrbuf = genl_family_attrbuf(&nfc_genl_family); |
|---|
| 109 | + const struct genl_dumpit_info *info = genl_dumpit_info(cb); |
|---|
| 122 | 110 | struct nfc_dev *dev; |
|---|
| 123 | | - int rc; |
|---|
| 124 | 111 | u32 idx; |
|---|
| 125 | 112 | |
|---|
| 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]) |
|---|
| 133 | 114 | return ERR_PTR(-EINVAL); |
|---|
| 134 | 115 | |
|---|
| 135 | | - idx = nla_get_u32(attrbuf[NFC_ATTR_DEVICE_INDEX]); |
|---|
| 116 | + idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]); |
|---|
| 136 | 117 | |
|---|
| 137 | 118 | dev = nfc_get_device(idx); |
|---|
| 138 | 119 | if (!dev) |
|---|
| .. | .. |
|---|
| 396 | 377 | if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx)) |
|---|
| 397 | 378 | goto nla_put_failure; |
|---|
| 398 | 379 | |
|---|
| 399 | | - sdp_attr = nla_nest_start(msg, NFC_ATTR_LLC_SDP); |
|---|
| 380 | + sdp_attr = nla_nest_start_noflag(msg, NFC_ATTR_LLC_SDP); |
|---|
| 400 | 381 | if (sdp_attr == NULL) { |
|---|
| 401 | 382 | rc = -ENOMEM; |
|---|
| 402 | 383 | goto nla_put_failure; |
|---|
| .. | .. |
|---|
| 406 | 387 | hlist_for_each_entry_safe(sdres, n, sdres_list, node) { |
|---|
| 407 | 388 | pr_debug("uri: %s, sap: %d\n", sdres->uri, sdres->sap); |
|---|
| 408 | 389 | |
|---|
| 409 | | - uri_attr = nla_nest_start(msg, i++); |
|---|
| 390 | + uri_attr = nla_nest_start_noflag(msg, i++); |
|---|
| 410 | 391 | if (uri_attr == NULL) { |
|---|
| 411 | 392 | rc = -ENOMEM; |
|---|
| 412 | 393 | goto nla_put_failure; |
|---|
| .. | .. |
|---|
| 1058 | 1039 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
|---|
| 1059 | 1040 | if (!msg) { |
|---|
| 1060 | 1041 | rc = -ENOMEM; |
|---|
| 1061 | | - goto exit; |
|---|
| 1042 | + goto put_local; |
|---|
| 1062 | 1043 | } |
|---|
| 1063 | 1044 | |
|---|
| 1064 | 1045 | rc = nfc_genl_send_params(msg, local, info->snd_portid, info->snd_seq); |
|---|
| 1046 | + |
|---|
| 1047 | +put_local: |
|---|
| 1048 | + nfc_llcp_local_put(local); |
|---|
| 1065 | 1049 | |
|---|
| 1066 | 1050 | exit: |
|---|
| 1067 | 1051 | device_unlock(&dev->dev); |
|---|
| .. | .. |
|---|
| 1124 | 1108 | if (info->attrs[NFC_ATTR_LLC_PARAM_LTO]) { |
|---|
| 1125 | 1109 | if (dev->dep_link_up) { |
|---|
| 1126 | 1110 | rc = -EINPROGRESS; |
|---|
| 1127 | | - goto exit; |
|---|
| 1111 | + goto put_local; |
|---|
| 1128 | 1112 | } |
|---|
| 1129 | 1113 | |
|---|
| 1130 | 1114 | local->lto = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_LTO]); |
|---|
| .. | .. |
|---|
| 1135 | 1119 | |
|---|
| 1136 | 1120 | if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX]) |
|---|
| 1137 | 1121 | local->miux = cpu_to_be16(miux); |
|---|
| 1122 | + |
|---|
| 1123 | +put_local: |
|---|
| 1124 | + nfc_llcp_local_put(local); |
|---|
| 1138 | 1125 | |
|---|
| 1139 | 1126 | exit: |
|---|
| 1140 | 1127 | device_unlock(&dev->dev); |
|---|
| .. | .. |
|---|
| 1185 | 1172 | tlvs_len = 0; |
|---|
| 1186 | 1173 | |
|---|
| 1187 | 1174 | 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); |
|---|
| 1190 | 1178 | |
|---|
| 1191 | 1179 | if (rc != 0) { |
|---|
| 1192 | 1180 | rc = -EINVAL; |
|---|
| 1193 | | - goto exit; |
|---|
| 1181 | + goto put_local; |
|---|
| 1194 | 1182 | } |
|---|
| 1195 | 1183 | |
|---|
| 1196 | 1184 | if (!sdp_attrs[NFC_SDP_ATTR_URI]) |
|---|
| .. | .. |
|---|
| 1209 | 1197 | sdreq = nfc_llcp_build_sdreq_tlv(tid, uri, uri_len); |
|---|
| 1210 | 1198 | if (sdreq == NULL) { |
|---|
| 1211 | 1199 | rc = -ENOMEM; |
|---|
| 1212 | | - goto exit; |
|---|
| 1200 | + goto put_local; |
|---|
| 1213 | 1201 | } |
|---|
| 1214 | 1202 | |
|---|
| 1215 | 1203 | tlvs_len += sdreq->tlv_len; |
|---|
| .. | .. |
|---|
| 1219 | 1207 | |
|---|
| 1220 | 1208 | if (hlist_empty(&sdreq_list)) { |
|---|
| 1221 | 1209 | rc = -EINVAL; |
|---|
| 1222 | | - goto exit; |
|---|
| 1210 | + goto put_local; |
|---|
| 1223 | 1211 | } |
|---|
| 1224 | 1212 | |
|---|
| 1225 | 1213 | rc = nfc_llcp_send_snl_sdreq(local, &sdreq_list, tlvs_len); |
|---|
| 1214 | + |
|---|
| 1215 | +put_local: |
|---|
| 1216 | + nfc_llcp_local_put(local); |
|---|
| 1217 | + |
|---|
| 1226 | 1218 | exit: |
|---|
| 1227 | 1219 | device_unlock(&dev->dev); |
|---|
| 1228 | 1220 | |
|---|
| .. | .. |
|---|
| 1262 | 1254 | struct sk_buff *msg; |
|---|
| 1263 | 1255 | void *hdr; |
|---|
| 1264 | 1256 | |
|---|
| 1265 | | - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
|---|
| 1257 | + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
|---|
| 1266 | 1258 | if (!msg) |
|---|
| 1267 | 1259 | return -ENOMEM; |
|---|
| 1268 | 1260 | |
|---|
| .. | .. |
|---|
| 1278 | 1270 | |
|---|
| 1279 | 1271 | genlmsg_end(msg, hdr); |
|---|
| 1280 | 1272 | |
|---|
| 1281 | | - genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
|---|
| 1273 | + genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
|---|
| 1282 | 1274 | |
|---|
| 1283 | 1275 | return 0; |
|---|
| 1284 | 1276 | |
|---|
| .. | .. |
|---|
| 1460 | 1452 | rc = dev->ops->se_io(dev, se_idx, apdu, |
|---|
| 1461 | 1453 | apdu_length, cb, cb_context); |
|---|
| 1462 | 1454 | |
|---|
| 1455 | + device_unlock(&dev->dev); |
|---|
| 1456 | + return rc; |
|---|
| 1457 | + |
|---|
| 1463 | 1458 | error: |
|---|
| 1464 | 1459 | device_unlock(&dev->dev); |
|---|
| 1460 | + kfree(cb_context); |
|---|
| 1465 | 1461 | return rc; |
|---|
| 1466 | 1462 | } |
|---|
| 1467 | 1463 | |
|---|
| .. | .. |
|---|
| 1515 | 1511 | u32 dev_idx, se_idx; |
|---|
| 1516 | 1512 | u8 *apdu; |
|---|
| 1517 | 1513 | size_t apdu_len; |
|---|
| 1514 | + int rc; |
|---|
| 1518 | 1515 | |
|---|
| 1519 | 1516 | if (!info->attrs[NFC_ATTR_DEVICE_INDEX] || |
|---|
| 1520 | 1517 | !info->attrs[NFC_ATTR_SE_INDEX] || |
|---|
| .. | .. |
|---|
| 1528 | 1525 | if (!dev) |
|---|
| 1529 | 1526 | return -ENODEV; |
|---|
| 1530 | 1527 | |
|---|
| 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 | + } |
|---|
| 1533 | 1532 | |
|---|
| 1534 | 1533 | 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 | + } |
|---|
| 1537 | 1538 | |
|---|
| 1538 | 1539 | 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 | + } |
|---|
| 1541 | 1544 | |
|---|
| 1542 | 1545 | 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 | + } |
|---|
| 1545 | 1550 | |
|---|
| 1546 | 1551 | ctx->dev_idx = dev_idx; |
|---|
| 1547 | 1552 | ctx->se_idx = se_idx; |
|---|
| 1548 | 1553 | |
|---|
| 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; |
|---|
| 1550 | 1559 | } |
|---|
| 1551 | 1560 | |
|---|
| 1552 | 1561 | static int nfc_genl_vendor_cmd(struct sk_buff *skb, |
|---|
| .. | .. |
|---|
| 1569 | 1578 | subcmd = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_SUBCMD]); |
|---|
| 1570 | 1579 | |
|---|
| 1571 | 1580 | dev = nfc_get_device(dev_idx); |
|---|
| 1572 | | - if (!dev || !dev->vendor_cmds || !dev->n_vendor_cmds) |
|---|
| 1581 | + if (!dev) |
|---|
| 1573 | 1582 | return -ENODEV; |
|---|
| 1583 | + |
|---|
| 1584 | + if (!dev->vendor_cmds || !dev->n_vendor_cmds) { |
|---|
| 1585 | + err = -ENODEV; |
|---|
| 1586 | + goto put_dev; |
|---|
| 1587 | + } |
|---|
| 1574 | 1588 | |
|---|
| 1575 | 1589 | if (info->attrs[NFC_ATTR_VENDOR_DATA]) { |
|---|
| 1576 | 1590 | data = nla_data(info->attrs[NFC_ATTR_VENDOR_DATA]); |
|---|
| 1577 | 1591 | 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 | + } |
|---|
| 1580 | 1596 | } else { |
|---|
| 1581 | 1597 | data = NULL; |
|---|
| 1582 | 1598 | data_len = 0; |
|---|
| .. | .. |
|---|
| 1591 | 1607 | dev->cur_cmd_info = info; |
|---|
| 1592 | 1608 | err = cmd->doit(dev, data, data_len); |
|---|
| 1593 | 1609 | dev->cur_cmd_info = NULL; |
|---|
| 1594 | | - return err; |
|---|
| 1610 | + goto put_dev; |
|---|
| 1595 | 1611 | } |
|---|
| 1596 | 1612 | |
|---|
| 1597 | | - return -EOPNOTSUPP; |
|---|
| 1613 | + err = -EOPNOTSUPP; |
|---|
| 1614 | + |
|---|
| 1615 | +put_dev: |
|---|
| 1616 | + nfc_put_device(dev); |
|---|
| 1617 | + return err; |
|---|
| 1598 | 1618 | } |
|---|
| 1599 | 1619 | |
|---|
| 1600 | 1620 | /* message building helper */ |
|---|
| .. | .. |
|---|
| 1677 | 1697 | static const struct genl_ops nfc_genl_ops[] = { |
|---|
| 1678 | 1698 | { |
|---|
| 1679 | 1699 | .cmd = NFC_CMD_GET_DEVICE, |
|---|
| 1700 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1680 | 1701 | .doit = nfc_genl_get_device, |
|---|
| 1681 | 1702 | .dumpit = nfc_genl_dump_devices, |
|---|
| 1682 | 1703 | .done = nfc_genl_dump_devices_done, |
|---|
| 1683 | | - .policy = nfc_genl_policy, |
|---|
| 1684 | 1704 | }, |
|---|
| 1685 | 1705 | { |
|---|
| 1686 | 1706 | .cmd = NFC_CMD_DEV_UP, |
|---|
| 1707 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1687 | 1708 | .doit = nfc_genl_dev_up, |
|---|
| 1688 | | - .policy = nfc_genl_policy, |
|---|
| 1689 | 1709 | }, |
|---|
| 1690 | 1710 | { |
|---|
| 1691 | 1711 | .cmd = NFC_CMD_DEV_DOWN, |
|---|
| 1712 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1692 | 1713 | .doit = nfc_genl_dev_down, |
|---|
| 1693 | | - .policy = nfc_genl_policy, |
|---|
| 1694 | 1714 | }, |
|---|
| 1695 | 1715 | { |
|---|
| 1696 | 1716 | .cmd = NFC_CMD_START_POLL, |
|---|
| 1717 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1697 | 1718 | .doit = nfc_genl_start_poll, |
|---|
| 1698 | | - .policy = nfc_genl_policy, |
|---|
| 1699 | 1719 | }, |
|---|
| 1700 | 1720 | { |
|---|
| 1701 | 1721 | .cmd = NFC_CMD_STOP_POLL, |
|---|
| 1722 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1702 | 1723 | .doit = nfc_genl_stop_poll, |
|---|
| 1703 | | - .policy = nfc_genl_policy, |
|---|
| 1704 | 1724 | }, |
|---|
| 1705 | 1725 | { |
|---|
| 1706 | 1726 | .cmd = NFC_CMD_DEP_LINK_UP, |
|---|
| 1727 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1707 | 1728 | .doit = nfc_genl_dep_link_up, |
|---|
| 1708 | | - .policy = nfc_genl_policy, |
|---|
| 1709 | 1729 | }, |
|---|
| 1710 | 1730 | { |
|---|
| 1711 | 1731 | .cmd = NFC_CMD_DEP_LINK_DOWN, |
|---|
| 1732 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1712 | 1733 | .doit = nfc_genl_dep_link_down, |
|---|
| 1713 | | - .policy = nfc_genl_policy, |
|---|
| 1714 | 1734 | }, |
|---|
| 1715 | 1735 | { |
|---|
| 1716 | 1736 | .cmd = NFC_CMD_GET_TARGET, |
|---|
| 1737 | + .validate = GENL_DONT_VALIDATE_STRICT | |
|---|
| 1738 | + GENL_DONT_VALIDATE_DUMP_STRICT, |
|---|
| 1717 | 1739 | .dumpit = nfc_genl_dump_targets, |
|---|
| 1718 | 1740 | .done = nfc_genl_dump_targets_done, |
|---|
| 1719 | | - .policy = nfc_genl_policy, |
|---|
| 1720 | 1741 | }, |
|---|
| 1721 | 1742 | { |
|---|
| 1722 | 1743 | .cmd = NFC_CMD_LLC_GET_PARAMS, |
|---|
| 1744 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1723 | 1745 | .doit = nfc_genl_llc_get_params, |
|---|
| 1724 | | - .policy = nfc_genl_policy, |
|---|
| 1725 | 1746 | }, |
|---|
| 1726 | 1747 | { |
|---|
| 1727 | 1748 | .cmd = NFC_CMD_LLC_SET_PARAMS, |
|---|
| 1749 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1728 | 1750 | .doit = nfc_genl_llc_set_params, |
|---|
| 1729 | | - .policy = nfc_genl_policy, |
|---|
| 1730 | 1751 | }, |
|---|
| 1731 | 1752 | { |
|---|
| 1732 | 1753 | .cmd = NFC_CMD_LLC_SDREQ, |
|---|
| 1754 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1733 | 1755 | .doit = nfc_genl_llc_sdreq, |
|---|
| 1734 | | - .policy = nfc_genl_policy, |
|---|
| 1735 | 1756 | }, |
|---|
| 1736 | 1757 | { |
|---|
| 1737 | 1758 | .cmd = NFC_CMD_FW_DOWNLOAD, |
|---|
| 1759 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1738 | 1760 | .doit = nfc_genl_fw_download, |
|---|
| 1739 | | - .policy = nfc_genl_policy, |
|---|
| 1740 | 1761 | }, |
|---|
| 1741 | 1762 | { |
|---|
| 1742 | 1763 | .cmd = NFC_CMD_ENABLE_SE, |
|---|
| 1764 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1743 | 1765 | .doit = nfc_genl_enable_se, |
|---|
| 1744 | | - .policy = nfc_genl_policy, |
|---|
| 1745 | 1766 | }, |
|---|
| 1746 | 1767 | { |
|---|
| 1747 | 1768 | .cmd = NFC_CMD_DISABLE_SE, |
|---|
| 1769 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1748 | 1770 | .doit = nfc_genl_disable_se, |
|---|
| 1749 | | - .policy = nfc_genl_policy, |
|---|
| 1750 | 1771 | }, |
|---|
| 1751 | 1772 | { |
|---|
| 1752 | 1773 | .cmd = NFC_CMD_GET_SE, |
|---|
| 1774 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1753 | 1775 | .dumpit = nfc_genl_dump_ses, |
|---|
| 1754 | 1776 | .done = nfc_genl_dump_ses_done, |
|---|
| 1755 | | - .policy = nfc_genl_policy, |
|---|
| 1756 | 1777 | }, |
|---|
| 1757 | 1778 | { |
|---|
| 1758 | 1779 | .cmd = NFC_CMD_SE_IO, |
|---|
| 1780 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1759 | 1781 | .doit = nfc_genl_se_io, |
|---|
| 1760 | | - .policy = nfc_genl_policy, |
|---|
| 1761 | 1782 | }, |
|---|
| 1762 | 1783 | { |
|---|
| 1763 | 1784 | .cmd = NFC_CMD_ACTIVATE_TARGET, |
|---|
| 1785 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1764 | 1786 | .doit = nfc_genl_activate_target, |
|---|
| 1765 | | - .policy = nfc_genl_policy, |
|---|
| 1766 | 1787 | }, |
|---|
| 1767 | 1788 | { |
|---|
| 1768 | 1789 | .cmd = NFC_CMD_VENDOR, |
|---|
| 1790 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1769 | 1791 | .doit = nfc_genl_vendor_cmd, |
|---|
| 1770 | | - .policy = nfc_genl_policy, |
|---|
| 1771 | 1792 | }, |
|---|
| 1772 | 1793 | { |
|---|
| 1773 | 1794 | .cmd = NFC_CMD_DEACTIVATE_TARGET, |
|---|
| 1795 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1774 | 1796 | .doit = nfc_genl_deactivate_target, |
|---|
| 1775 | | - .policy = nfc_genl_policy, |
|---|
| 1776 | 1797 | }, |
|---|
| 1777 | 1798 | }; |
|---|
| 1778 | 1799 | |
|---|
| .. | .. |
|---|
| 1781 | 1802 | .name = NFC_GENL_NAME, |
|---|
| 1782 | 1803 | .version = NFC_GENL_VERSION, |
|---|
| 1783 | 1804 | .maxattr = NFC_ATTR_MAX, |
|---|
| 1805 | + .policy = nfc_genl_policy, |
|---|
| 1784 | 1806 | .module = THIS_MODULE, |
|---|
| 1785 | 1807 | .ops = nfc_genl_ops, |
|---|
| 1786 | 1808 | .n_ops = ARRAY_SIZE(nfc_genl_ops), |
|---|