diff options
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_policy.c | 13 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 2 |
2 files changed, 11 insertions, 4 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 0ecb16a9a883..eb870fcc29cc 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -771,7 +771,8 @@ xfrm_policy_flush_secctx_check(struct net *net, u8 type, struct xfrm_audit *audi | |||
771 | 771 | ||
772 | int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info) | 772 | int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info) |
773 | { | 773 | { |
774 | int dir, err = 0; | 774 | int dir, err = 0, cnt = 0; |
775 | struct xfrm_policy *dp; | ||
775 | 776 | ||
776 | write_lock_bh(&xfrm_policy_lock); | 777 | write_lock_bh(&xfrm_policy_lock); |
777 | 778 | ||
@@ -789,8 +790,10 @@ int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info) | |||
789 | &net->xfrm.policy_inexact[dir], bydst) { | 790 | &net->xfrm.policy_inexact[dir], bydst) { |
790 | if (pol->type != type) | 791 | if (pol->type != type) |
791 | continue; | 792 | continue; |
792 | __xfrm_policy_unlink(pol, dir); | 793 | dp = __xfrm_policy_unlink(pol, dir); |
793 | write_unlock_bh(&xfrm_policy_lock); | 794 | write_unlock_bh(&xfrm_policy_lock); |
795 | if (dp) | ||
796 | cnt++; | ||
794 | 797 | ||
795 | xfrm_audit_policy_delete(pol, 1, audit_info->loginuid, | 798 | xfrm_audit_policy_delete(pol, 1, audit_info->loginuid, |
796 | audit_info->sessionid, | 799 | audit_info->sessionid, |
@@ -809,8 +812,10 @@ int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info) | |||
809 | bydst) { | 812 | bydst) { |
810 | if (pol->type != type) | 813 | if (pol->type != type) |
811 | continue; | 814 | continue; |
812 | __xfrm_policy_unlink(pol, dir); | 815 | dp = __xfrm_policy_unlink(pol, dir); |
813 | write_unlock_bh(&xfrm_policy_lock); | 816 | write_unlock_bh(&xfrm_policy_lock); |
817 | if (dp) | ||
818 | cnt++; | ||
814 | 819 | ||
815 | xfrm_audit_policy_delete(pol, 1, | 820 | xfrm_audit_policy_delete(pol, 1, |
816 | audit_info->loginuid, | 821 | audit_info->loginuid, |
@@ -824,6 +829,8 @@ int xfrm_policy_flush(struct net *net, u8 type, struct xfrm_audit *audit_info) | |||
824 | } | 829 | } |
825 | 830 | ||
826 | } | 831 | } |
832 | if (!cnt) | ||
833 | err = -ESRCH; | ||
827 | atomic_inc(&flow_cache_genid); | 834 | atomic_inc(&flow_cache_genid); |
828 | out: | 835 | out: |
829 | write_unlock_bh(&xfrm_policy_lock); | 836 | write_unlock_bh(&xfrm_policy_lock); |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 7c8700447040..b0fb7d3bc15e 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -1677,7 +1677,7 @@ static int xfrm_flush_policy(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
1677 | audit_info.secid = NETLINK_CB(skb).sid; | 1677 | audit_info.secid = NETLINK_CB(skb).sid; |
1678 | err = xfrm_policy_flush(net, type, &audit_info); | 1678 | err = xfrm_policy_flush(net, type, &audit_info); |
1679 | if (err) | 1679 | if (err) |
1680 | return err; | 1680 | return 0; |
1681 | c.data.type = type; | 1681 | c.data.type = type; |
1682 | c.event = nlh->nlmsg_type; | 1682 | c.event = nlh->nlmsg_type; |
1683 | c.seq = nlh->nlmsg_seq; | 1683 | c.seq = nlh->nlmsg_seq; |