aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_policy.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
-rw-r--r--net/xfrm/xfrm_policy.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index ec94f5795ea4..21e939235b39 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -912,6 +912,7 @@ restart:
912 } else if (delta > 0) { 912 } else if (delta > 0) {
913 p = &parent->rb_right; 913 p = &parent->rb_right;
914 } else { 914 } else {
915 bool same_prefixlen = node->prefixlen == n->prefixlen;
915 struct xfrm_policy *tmp; 916 struct xfrm_policy *tmp;
916 917
917 hlist_for_each_entry(tmp, &n->hhead, bydst) { 918 hlist_for_each_entry(tmp, &n->hhead, bydst) {
@@ -919,9 +920,11 @@ restart:
919 hlist_del_rcu(&tmp->bydst); 920 hlist_del_rcu(&tmp->bydst);
920 } 921 }
921 922
923 node->prefixlen = prefixlen;
924
922 xfrm_policy_inexact_list_reinsert(net, node, family); 925 xfrm_policy_inexact_list_reinsert(net, node, family);
923 926
924 if (node->prefixlen == n->prefixlen) { 927 if (same_prefixlen) {
925 kfree_rcu(n, rcu); 928 kfree_rcu(n, rcu);
926 return; 929 return;
927 } 930 }
@@ -929,7 +932,6 @@ restart:
929 rb_erase(*p, new); 932 rb_erase(*p, new);
930 kfree_rcu(n, rcu); 933 kfree_rcu(n, rcu);
931 n = node; 934 n = node;
932 n->prefixlen = prefixlen;
933 goto restart; 935 goto restart;
934 } 936 }
935 } 937 }