forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/net/xfrm/xfrm_user.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* xfrm_user.c: User interface to configure xfrm engine.
23 *
34 * Copyright (C) 2002 David S. Miller (davem@redhat.com)
....@@ -620,13 +621,8 @@
620621
621622 xfrm_smark_init(attrs, &x->props.smark);
622623
623
- if (attrs[XFRMA_IF_ID]) {
624
+ if (attrs[XFRMA_IF_ID])
624625 x->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
625
- if (!x->if_id) {
626
- err = -EINVAL;
627
- goto error;
628
- }
629
- }
630626
631627 err = __xfrm_init_state(x, false, attrs[XFRMA_OFFLOAD_DEV]);
632628 if (err)
....@@ -1043,8 +1039,8 @@
10431039 u8 proto = 0;
10441040 int err;
10451041
1046
- err = nlmsg_parse(cb->nlh, 0, attrs, XFRMA_MAX, xfrma_policy,
1047
- NULL);
1042
+ err = nlmsg_parse_deprecated(cb->nlh, 0, attrs, XFRMA_MAX,
1043
+ xfrma_policy, cb->extack);
10481044 if (err < 0)
10491045 return err;
10501046
....@@ -1357,13 +1353,8 @@
13571353
13581354 mark = xfrm_mark_get(attrs, &m);
13591355
1360
- if (attrs[XFRMA_IF_ID]) {
1356
+ if (attrs[XFRMA_IF_ID])
13611357 if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
1362
- if (!if_id) {
1363
- err = -EINVAL;
1364
- goto out_noput;
1365
- }
1366
- }
13671358
13681359 if (p->info.seq) {
13691360 x = xfrm_find_acq_byseq(net, mark, p->info.seq);
....@@ -1676,13 +1667,8 @@
16761667
16771668 xfrm_mark_get(attrs, &xp->mark);
16781669
1679
- if (attrs[XFRMA_IF_ID]) {
1670
+ if (attrs[XFRMA_IF_ID])
16801671 xp->if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
1681
- if (!xp->if_id) {
1682
- err = -EINVAL;
1683
- goto error;
1684
- }
1685
- }
16861672
16871673 return xp;
16881674 error:
....@@ -1926,7 +1912,6 @@
19261912 struct km_event c;
19271913 int delete;
19281914 struct xfrm_mark m;
1929
- u32 mark = xfrm_mark_get(attrs, &m);
19301915 u32 if_id = 0;
19311916
19321917 p = nlmsg_data(nlh);
....@@ -1943,8 +1928,11 @@
19431928 if (attrs[XFRMA_IF_ID])
19441929 if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
19451930
1931
+ xfrm_mark_get(attrs, &m);
1932
+
19461933 if (p->index)
1947
- xp = xfrm_policy_byid(net, mark, if_id, type, p->dir, p->index, delete, &err);
1934
+ xp = xfrm_policy_byid(net, &m, if_id, type, p->dir,
1935
+ p->index, delete, &err);
19481936 else {
19491937 struct nlattr *rt = attrs[XFRMA_SEC_CTX];
19501938 struct xfrm_sec_ctx *ctx;
....@@ -1961,8 +1949,8 @@
19611949 if (err)
19621950 return err;
19631951 }
1964
- xp = xfrm_policy_bysel_ctx(net, mark, if_id, type, p->dir, &p->sel,
1965
- ctx, delete, &err);
1952
+ xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
1953
+ &p->sel, ctx, delete, &err);
19661954 security_xfrm_policy_free(ctx);
19671955 }
19681956 if (xp == NULL)
....@@ -2229,7 +2217,6 @@
22292217 u8 type = XFRM_POLICY_TYPE_MAIN;
22302218 int err = -ENOENT;
22312219 struct xfrm_mark m;
2232
- u32 mark = xfrm_mark_get(attrs, &m);
22332220 u32 if_id = 0;
22342221
22352222 err = copy_from_user_policy_type(&type, attrs);
....@@ -2243,8 +2230,11 @@
22432230 if (attrs[XFRMA_IF_ID])
22442231 if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
22452232
2233
+ xfrm_mark_get(attrs, &m);
2234
+
22462235 if (p->index)
2247
- xp = xfrm_policy_byid(net, mark, if_id, type, p->dir, p->index, 0, &err);
2236
+ xp = xfrm_policy_byid(net, &m, if_id, type, p->dir, p->index,
2237
+ 0, &err);
22482238 else {
22492239 struct nlattr *rt = attrs[XFRMA_SEC_CTX];
22502240 struct xfrm_sec_ctx *ctx;
....@@ -2261,7 +2251,7 @@
22612251 if (err)
22622252 return err;
22632253 }
2264
- xp = xfrm_policy_bysel_ctx(net, mark, if_id, type, p->dir,
2254
+ xp = xfrm_policy_bysel_ctx(net, &m, if_id, type, p->dir,
22652255 &p->sel, ctx, 0, &err);
22662256 security_xfrm_policy_free(ctx);
22672257 }
....@@ -2433,6 +2423,7 @@
24332423 int n = 0;
24342424 struct net *net = sock_net(skb->sk);
24352425 struct xfrm_encap_tmpl *encap = NULL;
2426
+ u32 if_id = 0;
24362427
24372428 if (attrs[XFRMA_MIGRATE] == NULL)
24382429 return -EINVAL;
....@@ -2457,7 +2448,10 @@
24572448 return 0;
24582449 }
24592450
2460
- err = xfrm_migrate(&pi->sel, pi->dir, type, m, n, kmp, net, encap);
2451
+ if (attrs[XFRMA_IF_ID])
2452
+ if_id = nla_get_u32(attrs[XFRMA_IF_ID]);
2453
+
2454
+ err = xfrm_migrate(&pi->sel, pi->dir, type, m, n, kmp, net, encap, if_id);
24612455
24622456 kfree(encap);
24632457
....@@ -2751,9 +2745,9 @@
27512745 goto err;
27522746 }
27532747
2754
- err = nlmsg_parse(nlh, xfrm_msg_min[type], attrs,
2755
- link->nla_max ? : XFRMA_MAX,
2756
- link->nla_pol ? : xfrma_policy, extack);
2748
+ err = nlmsg_parse_deprecated(nlh, xfrm_msg_min[type], attrs,
2749
+ link->nla_max ? : XFRMA_MAX,
2750
+ link->nla_pol ? : xfrma_policy, extack);
27572751 if (err < 0)
27582752 goto err;
27592753
....@@ -2764,6 +2758,16 @@
27642758
27652759 err = link->doit(skb, nlh, attrs);
27662760
2761
+ /* We need to free skb allocated in xfrm_alloc_compat() before
2762
+ * returning from this function, because consume_skb() won't take
2763
+ * care of frag_list since netlink destructor sets
2764
+ * sbk->head to NULL. (see netlink_skb_destructor())
2765
+ */
2766
+ if (skb_has_frag_list(skb)) {
2767
+ kfree_skb(skb_shinfo(skb)->frag_list);
2768
+ skb_shinfo(skb)->frag_list = NULL;
2769
+ }
2770
+
27672771 err:
27682772 kvfree(nlh64);
27692773 return err;