| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * NetLabel CIPSO/IPv4 Support |
|---|
| 3 | 4 | * |
|---|
| .. | .. |
|---|
| 6 | 7 | * protocols such as CIPSO and RIPSO. |
|---|
| 7 | 8 | * |
|---|
| 8 | 9 | * Author: Paul Moore <paul@paul-moore.com> |
|---|
| 9 | | - * |
|---|
| 10 | 10 | */ |
|---|
| 11 | 11 | |
|---|
| 12 | 12 | /* |
|---|
| 13 | 13 | * (c) Copyright Hewlett-Packard Development Company, L.P., 2006 |
|---|
| 14 | | - * |
|---|
| 15 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 16 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 17 | | - * the Free Software Foundation; either version 2 of the License, or |
|---|
| 18 | | - * (at your option) any later version. |
|---|
| 19 | | - * |
|---|
| 20 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 21 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 22 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
|---|
| 23 | | - * the GNU General Public License for more details. |
|---|
| 24 | | - * |
|---|
| 25 | | - * You should have received a copy of the GNU General Public License |
|---|
| 26 | | - * along with this program; if not, see <http://www.gnu.org/licenses/>. |
|---|
| 27 | | - * |
|---|
| 28 | 14 | */ |
|---|
| 29 | 15 | |
|---|
| 30 | 16 | #include <linux/types.h> |
|---|
| .. | .. |
|---|
| 99 | 85 | |
|---|
| 100 | 86 | doi_def->doi = nla_get_u32(info->attrs[NLBL_CIPSOV4_A_DOI]); |
|---|
| 101 | 87 | |
|---|
| 102 | | - if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_TAGLST], |
|---|
| 103 | | - NLBL_CIPSOV4_A_MAX, |
|---|
| 104 | | - netlbl_cipsov4_genl_policy, NULL) != 0) |
|---|
| 88 | + if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_TAGLST], |
|---|
| 89 | + NLBL_CIPSOV4_A_MAX, |
|---|
| 90 | + netlbl_cipsov4_genl_policy, |
|---|
| 91 | + NULL) != 0) |
|---|
| 105 | 92 | return -EINVAL; |
|---|
| 106 | 93 | |
|---|
| 107 | 94 | nla_for_each_nested(nla, info->attrs[NLBL_CIPSOV4_A_TAGLST], nla_rem) |
|---|
| .. | .. |
|---|
| 146 | 133 | !info->attrs[NLBL_CIPSOV4_A_MLSLVLLST]) |
|---|
| 147 | 134 | return -EINVAL; |
|---|
| 148 | 135 | |
|---|
| 149 | | - if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], |
|---|
| 150 | | - NLBL_CIPSOV4_A_MAX, |
|---|
| 151 | | - netlbl_cipsov4_genl_policy, NULL) != 0) |
|---|
| 136 | + if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], |
|---|
| 137 | + NLBL_CIPSOV4_A_MAX, |
|---|
| 138 | + netlbl_cipsov4_genl_policy, |
|---|
| 139 | + NULL) != 0) |
|---|
| 152 | 140 | return -EINVAL; |
|---|
| 153 | 141 | |
|---|
| 154 | 142 | doi_def = kmalloc(sizeof(*doi_def), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 170 | 158 | info->attrs[NLBL_CIPSOV4_A_MLSLVLLST], |
|---|
| 171 | 159 | nla_a_rem) |
|---|
| 172 | 160 | if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSLVL) { |
|---|
| 173 | | - if (nla_validate_nested(nla_a, NLBL_CIPSOV4_A_MAX, |
|---|
| 174 | | - netlbl_cipsov4_genl_policy, |
|---|
| 175 | | - NULL) != 0) |
|---|
| 161 | + if (nla_validate_nested_deprecated(nla_a, |
|---|
| 162 | + NLBL_CIPSOV4_A_MAX, |
|---|
| 163 | + netlbl_cipsov4_genl_policy, |
|---|
| 164 | + NULL) != 0) |
|---|
| 176 | 165 | goto add_std_failure; |
|---|
| 177 | 166 | nla_for_each_nested(nla_b, nla_a, nla_b_rem) |
|---|
| 178 | 167 | switch (nla_type(nla_b)) { |
|---|
| .. | .. |
|---|
| 234 | 223 | } |
|---|
| 235 | 224 | |
|---|
| 236 | 225 | if (info->attrs[NLBL_CIPSOV4_A_MLSCATLST]) { |
|---|
| 237 | | - if (nla_validate_nested(info->attrs[NLBL_CIPSOV4_A_MLSCATLST], |
|---|
| 238 | | - NLBL_CIPSOV4_A_MAX, |
|---|
| 239 | | - netlbl_cipsov4_genl_policy, NULL) != 0) |
|---|
| 226 | + if (nla_validate_nested_deprecated(info->attrs[NLBL_CIPSOV4_A_MLSCATLST], |
|---|
| 227 | + NLBL_CIPSOV4_A_MAX, |
|---|
| 228 | + netlbl_cipsov4_genl_policy, |
|---|
| 229 | + NULL) != 0) |
|---|
| 240 | 230 | goto add_std_failure; |
|---|
| 241 | 231 | |
|---|
| 242 | 232 | nla_for_each_nested(nla_a, |
|---|
| 243 | 233 | info->attrs[NLBL_CIPSOV4_A_MLSCATLST], |
|---|
| 244 | 234 | nla_a_rem) |
|---|
| 245 | 235 | if (nla_type(nla_a) == NLBL_CIPSOV4_A_MLSCAT) { |
|---|
| 246 | | - if (nla_validate_nested(nla_a, |
|---|
| 247 | | - NLBL_CIPSOV4_A_MAX, |
|---|
| 248 | | - netlbl_cipsov4_genl_policy, |
|---|
| 249 | | - NULL) != 0) |
|---|
| 236 | + if (nla_validate_nested_deprecated(nla_a, |
|---|
| 237 | + NLBL_CIPSOV4_A_MAX, |
|---|
| 238 | + netlbl_cipsov4_genl_policy, |
|---|
| 239 | + NULL) != 0) |
|---|
| 250 | 240 | goto add_std_failure; |
|---|
| 251 | 241 | nla_for_each_nested(nla_b, nla_a, nla_b_rem) |
|---|
| 252 | 242 | switch (nla_type(nla_b)) { |
|---|
| .. | .. |
|---|
| 498 | 488 | if (ret_val != 0) |
|---|
| 499 | 489 | goto list_failure_lock; |
|---|
| 500 | 490 | |
|---|
| 501 | | - nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_TAGLST); |
|---|
| 491 | + nla_a = nla_nest_start_noflag(ans_skb, NLBL_CIPSOV4_A_TAGLST); |
|---|
| 502 | 492 | if (nla_a == NULL) { |
|---|
| 503 | 493 | ret_val = -ENOMEM; |
|---|
| 504 | 494 | goto list_failure_lock; |
|---|
| .. | .. |
|---|
| 517 | 507 | |
|---|
| 518 | 508 | switch (doi_def->type) { |
|---|
| 519 | 509 | case CIPSO_V4_MAP_TRANS: |
|---|
| 520 | | - nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSLVLLST); |
|---|
| 510 | + nla_a = nla_nest_start_noflag(ans_skb, |
|---|
| 511 | + NLBL_CIPSOV4_A_MLSLVLLST); |
|---|
| 521 | 512 | if (nla_a == NULL) { |
|---|
| 522 | 513 | ret_val = -ENOMEM; |
|---|
| 523 | 514 | goto list_failure_lock; |
|---|
| .. | .. |
|---|
| 529 | 520 | CIPSO_V4_INV_LVL) |
|---|
| 530 | 521 | continue; |
|---|
| 531 | 522 | |
|---|
| 532 | | - nla_b = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSLVL); |
|---|
| 523 | + nla_b = nla_nest_start_noflag(ans_skb, |
|---|
| 524 | + NLBL_CIPSOV4_A_MLSLVL); |
|---|
| 533 | 525 | if (nla_b == NULL) { |
|---|
| 534 | 526 | ret_val = -ENOMEM; |
|---|
| 535 | 527 | goto list_retry; |
|---|
| .. | .. |
|---|
| 548 | 540 | } |
|---|
| 549 | 541 | nla_nest_end(ans_skb, nla_a); |
|---|
| 550 | 542 | |
|---|
| 551 | | - nla_a = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSCATLST); |
|---|
| 543 | + nla_a = nla_nest_start_noflag(ans_skb, |
|---|
| 544 | + NLBL_CIPSOV4_A_MLSCATLST); |
|---|
| 552 | 545 | if (nla_a == NULL) { |
|---|
| 553 | 546 | ret_val = -ENOMEM; |
|---|
| 554 | 547 | goto list_retry; |
|---|
| .. | .. |
|---|
| 560 | 553 | CIPSO_V4_INV_CAT) |
|---|
| 561 | 554 | continue; |
|---|
| 562 | 555 | |
|---|
| 563 | | - nla_b = nla_nest_start(ans_skb, NLBL_CIPSOV4_A_MLSCAT); |
|---|
| 556 | + nla_b = nla_nest_start_noflag(ans_skb, |
|---|
| 557 | + NLBL_CIPSOV4_A_MLSCAT); |
|---|
| 564 | 558 | if (nla_b == NULL) { |
|---|
| 565 | 559 | ret_val = -ENOMEM; |
|---|
| 566 | 560 | goto list_retry; |
|---|
| .. | .. |
|---|
| 733 | 727 | * NetLabel Generic NETLINK Command Definitions |
|---|
| 734 | 728 | */ |
|---|
| 735 | 729 | |
|---|
| 736 | | -static const struct genl_ops netlbl_cipsov4_ops[] = { |
|---|
| 730 | +static const struct genl_small_ops netlbl_cipsov4_ops[] = { |
|---|
| 737 | 731 | { |
|---|
| 738 | 732 | .cmd = NLBL_CIPSOV4_C_ADD, |
|---|
| 733 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 739 | 734 | .flags = GENL_ADMIN_PERM, |
|---|
| 740 | | - .policy = netlbl_cipsov4_genl_policy, |
|---|
| 741 | 735 | .doit = netlbl_cipsov4_add, |
|---|
| 742 | 736 | .dumpit = NULL, |
|---|
| 743 | 737 | }, |
|---|
| 744 | 738 | { |
|---|
| 745 | 739 | .cmd = NLBL_CIPSOV4_C_REMOVE, |
|---|
| 740 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 746 | 741 | .flags = GENL_ADMIN_PERM, |
|---|
| 747 | | - .policy = netlbl_cipsov4_genl_policy, |
|---|
| 748 | 742 | .doit = netlbl_cipsov4_remove, |
|---|
| 749 | 743 | .dumpit = NULL, |
|---|
| 750 | 744 | }, |
|---|
| 751 | 745 | { |
|---|
| 752 | 746 | .cmd = NLBL_CIPSOV4_C_LIST, |
|---|
| 747 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 753 | 748 | .flags = 0, |
|---|
| 754 | | - .policy = netlbl_cipsov4_genl_policy, |
|---|
| 755 | 749 | .doit = netlbl_cipsov4_list, |
|---|
| 756 | 750 | .dumpit = NULL, |
|---|
| 757 | 751 | }, |
|---|
| 758 | 752 | { |
|---|
| 759 | 753 | .cmd = NLBL_CIPSOV4_C_LISTALL, |
|---|
| 754 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
|---|
| 760 | 755 | .flags = 0, |
|---|
| 761 | | - .policy = netlbl_cipsov4_genl_policy, |
|---|
| 762 | 756 | .doit = NULL, |
|---|
| 763 | 757 | .dumpit = netlbl_cipsov4_listall, |
|---|
| 764 | 758 | }, |
|---|
| .. | .. |
|---|
| 769 | 763 | .name = NETLBL_NLTYPE_CIPSOV4_NAME, |
|---|
| 770 | 764 | .version = NETLBL_PROTO_VERSION, |
|---|
| 771 | 765 | .maxattr = NLBL_CIPSOV4_A_MAX, |
|---|
| 766 | + .policy = netlbl_cipsov4_genl_policy, |
|---|
| 772 | 767 | .module = THIS_MODULE, |
|---|
| 773 | | - .ops = netlbl_cipsov4_ops, |
|---|
| 774 | | - .n_ops = ARRAY_SIZE(netlbl_cipsov4_ops), |
|---|
| 768 | + .small_ops = netlbl_cipsov4_ops, |
|---|
| 769 | + .n_small_ops = ARRAY_SIZE(netlbl_cipsov4_ops), |
|---|
| 775 | 770 | }; |
|---|
| 776 | 771 | |
|---|
| 777 | 772 | /* |
|---|