| .. | .. |
|---|
| 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; |
|---|
| .. | .. |
|---|
| 1185 | 1166 | tlvs_len = 0; |
|---|
| 1186 | 1167 | |
|---|
| 1187 | 1168 | 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); |
|---|
| 1169 | + rc = nla_parse_nested_deprecated(sdp_attrs, NFC_SDP_ATTR_MAX, |
|---|
| 1170 | + attr, nfc_sdp_genl_policy, |
|---|
| 1171 | + info->extack); |
|---|
| 1190 | 1172 | |
|---|
| 1191 | 1173 | if (rc != 0) { |
|---|
| 1192 | 1174 | rc = -EINVAL; |
|---|
| .. | .. |
|---|
| 1262 | 1244 | struct sk_buff *msg; |
|---|
| 1263 | 1245 | void *hdr; |
|---|
| 1264 | 1246 | |
|---|
| 1265 | | - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
|---|
| 1247 | + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
|---|
| 1266 | 1248 | if (!msg) |
|---|
| 1267 | 1249 | return -ENOMEM; |
|---|
| 1268 | 1250 | |
|---|
| .. | .. |
|---|
| 1278 | 1260 | |
|---|
| 1279 | 1261 | genlmsg_end(msg, hdr); |
|---|
| 1280 | 1262 | |
|---|
| 1281 | | - genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
|---|
| 1263 | + genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
|---|
| 1282 | 1264 | |
|---|
| 1283 | 1265 | return 0; |
|---|
| 1284 | 1266 | |
|---|
| .. | .. |
|---|
| 1677 | 1659 | static const struct genl_ops nfc_genl_ops[] = { |
|---|
| 1678 | 1660 | { |
|---|
| 1679 | 1661 | .cmd = NFC_CMD_GET_DEVICE, |
|---|
| 1662 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1680 | 1663 | .doit = nfc_genl_get_device, |
|---|
| 1681 | 1664 | .dumpit = nfc_genl_dump_devices, |
|---|
| 1682 | 1665 | .done = nfc_genl_dump_devices_done, |
|---|
| 1683 | | - .policy = nfc_genl_policy, |
|---|
| 1684 | 1666 | }, |
|---|
| 1685 | 1667 | { |
|---|
| 1686 | 1668 | .cmd = NFC_CMD_DEV_UP, |
|---|
| 1669 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1687 | 1670 | .doit = nfc_genl_dev_up, |
|---|
| 1688 | | - .policy = nfc_genl_policy, |
|---|
| 1689 | 1671 | }, |
|---|
| 1690 | 1672 | { |
|---|
| 1691 | 1673 | .cmd = NFC_CMD_DEV_DOWN, |
|---|
| 1674 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1692 | 1675 | .doit = nfc_genl_dev_down, |
|---|
| 1693 | | - .policy = nfc_genl_policy, |
|---|
| 1694 | 1676 | }, |
|---|
| 1695 | 1677 | { |
|---|
| 1696 | 1678 | .cmd = NFC_CMD_START_POLL, |
|---|
| 1679 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1697 | 1680 | .doit = nfc_genl_start_poll, |
|---|
| 1698 | | - .policy = nfc_genl_policy, |
|---|
| 1699 | 1681 | }, |
|---|
| 1700 | 1682 | { |
|---|
| 1701 | 1683 | .cmd = NFC_CMD_STOP_POLL, |
|---|
| 1684 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1702 | 1685 | .doit = nfc_genl_stop_poll, |
|---|
| 1703 | | - .policy = nfc_genl_policy, |
|---|
| 1704 | 1686 | }, |
|---|
| 1705 | 1687 | { |
|---|
| 1706 | 1688 | .cmd = NFC_CMD_DEP_LINK_UP, |
|---|
| 1689 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1707 | 1690 | .doit = nfc_genl_dep_link_up, |
|---|
| 1708 | | - .policy = nfc_genl_policy, |
|---|
| 1709 | 1691 | }, |
|---|
| 1710 | 1692 | { |
|---|
| 1711 | 1693 | .cmd = NFC_CMD_DEP_LINK_DOWN, |
|---|
| 1694 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1712 | 1695 | .doit = nfc_genl_dep_link_down, |
|---|
| 1713 | | - .policy = nfc_genl_policy, |
|---|
| 1714 | 1696 | }, |
|---|
| 1715 | 1697 | { |
|---|
| 1716 | 1698 | .cmd = NFC_CMD_GET_TARGET, |
|---|
| 1699 | + .validate = GENL_DONT_VALIDATE_STRICT | |
|---|
| 1700 | + GENL_DONT_VALIDATE_DUMP_STRICT, |
|---|
| 1717 | 1701 | .dumpit = nfc_genl_dump_targets, |
|---|
| 1718 | 1702 | .done = nfc_genl_dump_targets_done, |
|---|
| 1719 | | - .policy = nfc_genl_policy, |
|---|
| 1720 | 1703 | }, |
|---|
| 1721 | 1704 | { |
|---|
| 1722 | 1705 | .cmd = NFC_CMD_LLC_GET_PARAMS, |
|---|
| 1706 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1723 | 1707 | .doit = nfc_genl_llc_get_params, |
|---|
| 1724 | | - .policy = nfc_genl_policy, |
|---|
| 1725 | 1708 | }, |
|---|
| 1726 | 1709 | { |
|---|
| 1727 | 1710 | .cmd = NFC_CMD_LLC_SET_PARAMS, |
|---|
| 1711 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1728 | 1712 | .doit = nfc_genl_llc_set_params, |
|---|
| 1729 | | - .policy = nfc_genl_policy, |
|---|
| 1730 | 1713 | }, |
|---|
| 1731 | 1714 | { |
|---|
| 1732 | 1715 | .cmd = NFC_CMD_LLC_SDREQ, |
|---|
| 1716 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1733 | 1717 | .doit = nfc_genl_llc_sdreq, |
|---|
| 1734 | | - .policy = nfc_genl_policy, |
|---|
| 1735 | 1718 | }, |
|---|
| 1736 | 1719 | { |
|---|
| 1737 | 1720 | .cmd = NFC_CMD_FW_DOWNLOAD, |
|---|
| 1721 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1738 | 1722 | .doit = nfc_genl_fw_download, |
|---|
| 1739 | | - .policy = nfc_genl_policy, |
|---|
| 1740 | 1723 | }, |
|---|
| 1741 | 1724 | { |
|---|
| 1742 | 1725 | .cmd = NFC_CMD_ENABLE_SE, |
|---|
| 1726 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1743 | 1727 | .doit = nfc_genl_enable_se, |
|---|
| 1744 | | - .policy = nfc_genl_policy, |
|---|
| 1745 | 1728 | }, |
|---|
| 1746 | 1729 | { |
|---|
| 1747 | 1730 | .cmd = NFC_CMD_DISABLE_SE, |
|---|
| 1731 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1748 | 1732 | .doit = nfc_genl_disable_se, |
|---|
| 1749 | | - .policy = nfc_genl_policy, |
|---|
| 1750 | 1733 | }, |
|---|
| 1751 | 1734 | { |
|---|
| 1752 | 1735 | .cmd = NFC_CMD_GET_SE, |
|---|
| 1736 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1753 | 1737 | .dumpit = nfc_genl_dump_ses, |
|---|
| 1754 | 1738 | .done = nfc_genl_dump_ses_done, |
|---|
| 1755 | | - .policy = nfc_genl_policy, |
|---|
| 1756 | 1739 | }, |
|---|
| 1757 | 1740 | { |
|---|
| 1758 | 1741 | .cmd = NFC_CMD_SE_IO, |
|---|
| 1742 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1759 | 1743 | .doit = nfc_genl_se_io, |
|---|
| 1760 | | - .policy = nfc_genl_policy, |
|---|
| 1761 | 1744 | }, |
|---|
| 1762 | 1745 | { |
|---|
| 1763 | 1746 | .cmd = NFC_CMD_ACTIVATE_TARGET, |
|---|
| 1747 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1764 | 1748 | .doit = nfc_genl_activate_target, |
|---|
| 1765 | | - .policy = nfc_genl_policy, |
|---|
| 1766 | 1749 | }, |
|---|
| 1767 | 1750 | { |
|---|
| 1768 | 1751 | .cmd = NFC_CMD_VENDOR, |
|---|
| 1752 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1769 | 1753 | .doit = nfc_genl_vendor_cmd, |
|---|
| 1770 | | - .policy = nfc_genl_policy, |
|---|
| 1771 | 1754 | }, |
|---|
| 1772 | 1755 | { |
|---|
| 1773 | 1756 | .cmd = NFC_CMD_DEACTIVATE_TARGET, |
|---|
| 1757 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 1774 | 1758 | .doit = nfc_genl_deactivate_target, |
|---|
| 1775 | | - .policy = nfc_genl_policy, |
|---|
| 1776 | 1759 | }, |
|---|
| 1777 | 1760 | }; |
|---|
| 1778 | 1761 | |
|---|
| .. | .. |
|---|
| 1781 | 1764 | .name = NFC_GENL_NAME, |
|---|
| 1782 | 1765 | .version = NFC_GENL_VERSION, |
|---|
| 1783 | 1766 | .maxattr = NFC_ATTR_MAX, |
|---|
| 1767 | + .policy = nfc_genl_policy, |
|---|
| 1784 | 1768 | .module = THIS_MODULE, |
|---|
| 1785 | 1769 | .ops = nfc_genl_ops, |
|---|
| 1786 | 1770 | .n_ops = ARRAY_SIZE(nfc_genl_ops), |
|---|