diff options
Diffstat (limited to 'net/xfrm/xfrm_user.c')
| -rw-r--r-- | net/xfrm/xfrm_user.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 81d1005830f4..c21dc26141ea 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -427,23 +427,25 @@ static int xfrm_del_sa(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfrma) | |||
| 427 | if (x == NULL) | 427 | if (x == NULL) |
| 428 | return -ESRCH; | 428 | return -ESRCH; |
| 429 | 429 | ||
| 430 | if ((err = security_xfrm_state_delete(x)) != 0) | ||
| 431 | goto out; | ||
| 432 | |||
| 430 | if (xfrm_state_kern(x)) { | 433 | if (xfrm_state_kern(x)) { |
| 431 | xfrm_state_put(x); | 434 | err = -EPERM; |
| 432 | return -EPERM; | 435 | goto out; |
| 433 | } | 436 | } |
| 434 | 437 | ||
| 435 | err = xfrm_state_delete(x); | 438 | err = xfrm_state_delete(x); |
| 436 | if (err < 0) { | 439 | if (err < 0) |
| 437 | xfrm_state_put(x); | 440 | goto out; |
| 438 | return err; | ||
| 439 | } | ||
| 440 | 441 | ||
| 441 | c.seq = nlh->nlmsg_seq; | 442 | c.seq = nlh->nlmsg_seq; |
| 442 | c.pid = nlh->nlmsg_pid; | 443 | c.pid = nlh->nlmsg_pid; |
| 443 | c.event = nlh->nlmsg_type; | 444 | c.event = nlh->nlmsg_type; |
| 444 | km_state_notify(x, &c); | 445 | km_state_notify(x, &c); |
| 445 | xfrm_state_put(x); | ||
| 446 | 446 | ||
| 447 | out: | ||
| 448 | xfrm_state_put(x); | ||
| 447 | return err; | 449 | return err; |
| 448 | } | 450 | } |
| 449 | 451 | ||
| @@ -1055,6 +1057,8 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr | |||
| 1055 | MSG_DONTWAIT); | 1057 | MSG_DONTWAIT); |
| 1056 | } | 1058 | } |
| 1057 | } else { | 1059 | } else { |
| 1060 | if ((err = security_xfrm_policy_delete(xp)) != 0) | ||
| 1061 | goto out; | ||
| 1058 | c.data.byid = p->index; | 1062 | c.data.byid = p->index; |
| 1059 | c.event = nlh->nlmsg_type; | 1063 | c.event = nlh->nlmsg_type; |
| 1060 | c.seq = nlh->nlmsg_seq; | 1064 | c.seq = nlh->nlmsg_seq; |
| @@ -1064,6 +1068,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh, void **xfr | |||
| 1064 | 1068 | ||
| 1065 | xfrm_pol_put(xp); | 1069 | xfrm_pol_put(xp); |
| 1066 | 1070 | ||
| 1071 | out: | ||
| 1067 | return err; | 1072 | return err; |
| 1068 | } | 1073 | } |
| 1069 | 1074 | ||
