diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/key/af_key.c | 17 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 19 |
2 files changed, 23 insertions, 13 deletions
diff --git a/net/key/af_key.c b/net/key/af_key.c index 859582275cab..d5e2121ea207 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -1454,21 +1454,23 @@ static int pfkey_delete(struct sock *sk, struct sk_buff *skb, struct sadb_msg *h | |||
1454 | if (x == NULL) | 1454 | if (x == NULL) |
1455 | return -ESRCH; | 1455 | return -ESRCH; |
1456 | 1456 | ||
1457 | if ((err = security_xfrm_state_delete(x))) | ||
1458 | goto out; | ||
1459 | |||
1457 | if (xfrm_state_kern(x)) { | 1460 | if (xfrm_state_kern(x)) { |
1458 | xfrm_state_put(x); | 1461 | err = -EPERM; |
1459 | return -EPERM; | 1462 | goto out; |
1460 | } | 1463 | } |
1461 | 1464 | ||
1462 | err = xfrm_state_delete(x); | 1465 | err = xfrm_state_delete(x); |
1463 | if (err < 0) { | 1466 | if (err < 0) |
1464 | xfrm_state_put(x); | 1467 | goto out; |
1465 | return err; | ||
1466 | } | ||
1467 | 1468 | ||
1468 | c.seq = hdr->sadb_msg_seq; | 1469 | c.seq = hdr->sadb_msg_seq; |
1469 | c.pid = hdr->sadb_msg_pid; | 1470 | c.pid = hdr->sadb_msg_pid; |
1470 | c.event = XFRM_MSG_DELSA; | 1471 | c.event = XFRM_MSG_DELSA; |
1471 | km_state_notify(x, &c); | 1472 | km_state_notify(x, &c); |
1473 | out: | ||
1472 | xfrm_state_put(x); | 1474 | xfrm_state_put(x); |
1473 | 1475 | ||
1474 | return err; | 1476 | return err; |
@@ -2274,11 +2276,14 @@ static int pfkey_spddelete(struct sock *sk, struct sk_buff *skb, struct sadb_msg | |||
2274 | 2276 | ||
2275 | err = 0; | 2277 | err = 0; |
2276 | 2278 | ||
2279 | if ((err = security_xfrm_policy_delete(xp))) | ||
2280 | goto out; | ||
2277 | c.seq = hdr->sadb_msg_seq; | 2281 | c.seq = hdr->sadb_msg_seq; |
2278 | c.pid = hdr->sadb_msg_pid; | 2282 | c.pid = hdr->sadb_msg_pid; |
2279 | c.event = XFRM_MSG_DELPOLICY; | 2283 | c.event = XFRM_MSG_DELPOLICY; |
2280 | km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c); | 2284 | km_policy_notify(xp, pol->sadb_x_policy_dir-1, &c); |
2281 | 2285 | ||
2286 | out: | ||
2282 | xfrm_pol_put(xp); | 2287 | xfrm_pol_put(xp); |
2283 | return err; | 2288 | return err; |
2284 | } | 2289 | } |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 81d1005830f4..a3733d2db3ba 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)) | ||
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)) | ||
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 | ||