diff options
author | Paul Moore <paul.moore@hp.com> | 2008-04-12 22:07:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-12 22:07:52 -0400 |
commit | 03e1ad7b5d871d4189b1da3125c2f12d1b5f7d0b (patch) | |
tree | 1e7f291ac6bd0c1f3a95e8252c32fcce7ff47ea7 /net/xfrm/xfrm_policy.c | |
parent | 00447872a643787411c2c0cb1df6169dda8b0c47 (diff) |
LSM: Make the Labeled IPsec hooks more stack friendly
The xfrm_get_policy() and xfrm_add_pol_expire() put some rather large structs
on the stack to work around the LSM API. This patch attempts to fix that
problem by changing the LSM API to require only the relevant "security"
pointers instead of the entire SPD entry; we do this for all of the
security_xfrm_policy*() functions to keep things consistent.
Signed-off-by: Paul Moore <paul.moore@hp.com>
Acked-by: James Morris <jmorris@namei.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm/xfrm_policy.c')
-rw-r--r-- | net/xfrm/xfrm_policy.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 15d73e47cc2c..ab4d0e598a2c 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -263,7 +263,7 @@ void xfrm_policy_destroy(struct xfrm_policy *policy) | |||
263 | list_del(&policy->bytype); | 263 | list_del(&policy->bytype); |
264 | write_unlock_bh(&xfrm_policy_lock); | 264 | write_unlock_bh(&xfrm_policy_lock); |
265 | 265 | ||
266 | security_xfrm_policy_free(policy); | 266 | security_xfrm_policy_free(policy->security); |
267 | kfree(policy); | 267 | kfree(policy); |
268 | } | 268 | } |
269 | EXPORT_SYMBOL(xfrm_policy_destroy); | 269 | EXPORT_SYMBOL(xfrm_policy_destroy); |
@@ -676,7 +676,8 @@ struct xfrm_policy *xfrm_policy_bysel_ctx(u8 type, int dir, | |||
676 | xfrm_sec_ctx_match(ctx, pol->security)) { | 676 | xfrm_sec_ctx_match(ctx, pol->security)) { |
677 | xfrm_pol_hold(pol); | 677 | xfrm_pol_hold(pol); |
678 | if (delete) { | 678 | if (delete) { |
679 | *err = security_xfrm_policy_delete(pol); | 679 | *err = security_xfrm_policy_delete( |
680 | pol->security); | ||
680 | if (*err) { | 681 | if (*err) { |
681 | write_unlock_bh(&xfrm_policy_lock); | 682 | write_unlock_bh(&xfrm_policy_lock); |
682 | return pol; | 683 | return pol; |
@@ -718,7 +719,8 @@ struct xfrm_policy *xfrm_policy_byid(u8 type, int dir, u32 id, int delete, | |||
718 | if (pol->type == type && pol->index == id) { | 719 | if (pol->type == type && pol->index == id) { |
719 | xfrm_pol_hold(pol); | 720 | xfrm_pol_hold(pol); |
720 | if (delete) { | 721 | if (delete) { |
721 | *err = security_xfrm_policy_delete(pol); | 722 | *err = security_xfrm_policy_delete( |
723 | pol->security); | ||
722 | if (*err) { | 724 | if (*err) { |
723 | write_unlock_bh(&xfrm_policy_lock); | 725 | write_unlock_bh(&xfrm_policy_lock); |
724 | return pol; | 726 | return pol; |
@@ -756,7 +758,7 @@ xfrm_policy_flush_secctx_check(u8 type, struct xfrm_audit *audit_info) | |||
756 | &xfrm_policy_inexact[dir], bydst) { | 758 | &xfrm_policy_inexact[dir], bydst) { |
757 | if (pol->type != type) | 759 | if (pol->type != type) |
758 | continue; | 760 | continue; |
759 | err = security_xfrm_policy_delete(pol); | 761 | err = security_xfrm_policy_delete(pol->security); |
760 | if (err) { | 762 | if (err) { |
761 | xfrm_audit_policy_delete(pol, 0, | 763 | xfrm_audit_policy_delete(pol, 0, |
762 | audit_info->loginuid, | 764 | audit_info->loginuid, |
@@ -770,7 +772,8 @@ xfrm_policy_flush_secctx_check(u8 type, struct xfrm_audit *audit_info) | |||
770 | bydst) { | 772 | bydst) { |
771 | if (pol->type != type) | 773 | if (pol->type != type) |
772 | continue; | 774 | continue; |
773 | err = security_xfrm_policy_delete(pol); | 775 | err = security_xfrm_policy_delete( |
776 | pol->security); | ||
774 | if (err) { | 777 | if (err) { |
775 | xfrm_audit_policy_delete(pol, 0, | 778 | xfrm_audit_policy_delete(pol, 0, |
776 | audit_info->loginuid, | 779 | audit_info->loginuid, |
@@ -931,7 +934,8 @@ static int xfrm_policy_match(struct xfrm_policy *pol, struct flowi *fl, | |||
931 | 934 | ||
932 | match = xfrm_selector_match(sel, fl, family); | 935 | match = xfrm_selector_match(sel, fl, family); |
933 | if (match) | 936 | if (match) |
934 | ret = security_xfrm_policy_lookup(pol, fl->secid, dir); | 937 | ret = security_xfrm_policy_lookup(pol->security, fl->secid, |
938 | dir); | ||
935 | 939 | ||
936 | return ret; | 940 | return ret; |
937 | } | 941 | } |
@@ -1048,8 +1052,9 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(struct sock *sk, int dir, struc | |||
1048 | int err = 0; | 1052 | int err = 0; |
1049 | 1053 | ||
1050 | if (match) { | 1054 | if (match) { |
1051 | err = security_xfrm_policy_lookup(pol, fl->secid, | 1055 | err = security_xfrm_policy_lookup(pol->security, |
1052 | policy_to_flow_dir(dir)); | 1056 | fl->secid, |
1057 | policy_to_flow_dir(dir)); | ||
1053 | if (!err) | 1058 | if (!err) |
1054 | xfrm_pol_hold(pol); | 1059 | xfrm_pol_hold(pol); |
1055 | else if (err == -ESRCH) | 1060 | else if (err == -ESRCH) |
@@ -1138,7 +1143,8 @@ static struct xfrm_policy *clone_policy(struct xfrm_policy *old, int dir) | |||
1138 | 1143 | ||
1139 | if (newp) { | 1144 | if (newp) { |
1140 | newp->selector = old->selector; | 1145 | newp->selector = old->selector; |
1141 | if (security_xfrm_policy_clone(old, newp)) { | 1146 | if (security_xfrm_policy_clone(old->security, |
1147 | &newp->security)) { | ||
1142 | kfree(newp); | 1148 | kfree(newp); |
1143 | return NULL; /* ENOMEM */ | 1149 | return NULL; /* ENOMEM */ |
1144 | } | 1150 | } |