X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=security%2Fselinux%2Fss%2Fcontext.h;h=2eee0dab524d831585624f722f40e8f3e86b61a3;hb=refs%2Fheads%2Fvserver;hp=581409f6fed0a3078af9f4fa60dda6187b7ea90b;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/security/selinux/ss/context.h b/security/selinux/ss/context.h index 581409f6f..2eee0dab5 100644 --- a/security/selinux/ss/context.h +++ b/security/selinux/ss/context.h @@ -17,6 +17,7 @@ #include "ebitmap.h" #include "mls_types.h" +#include "security.h" /* * A security context consists of an authenticated user @@ -26,13 +27,9 @@ struct context { u32 user; u32 role; u32 type; -#ifdef CONFIG_SECURITY_SELINUX_MLS struct mls_range range; -#endif }; -#ifdef CONFIG_SECURITY_SELINUX_MLS - static inline void mls_context_init(struct context *c) { memset(&c->range, 0, sizeof(c->range)); @@ -42,6 +39,9 @@ static inline int mls_context_cpy(struct context *dst, struct context *src) { int rc; + if (!selinux_mls_enabled) + return 0; + dst->range.level[0].sens = src->range.level[0].sens; rc = ebitmap_cpy(&dst->range.level[0].cat, &src->range.level[0].cat); if (rc) @@ -55,8 +55,34 @@ out: return rc; } +/* + * Sets both levels in the MLS range of 'dst' to the low level of 'src'. + */ +static inline int mls_context_cpy_low(struct context *dst, struct context *src) +{ + int rc; + + if (!selinux_mls_enabled) + return 0; + + dst->range.level[0].sens = src->range.level[0].sens; + rc = ebitmap_cpy(&dst->range.level[0].cat, &src->range.level[0].cat); + if (rc) + goto out; + + dst->range.level[1].sens = src->range.level[0].sens; + rc = ebitmap_cpy(&dst->range.level[1].cat, &src->range.level[0].cat); + if (rc) + ebitmap_destroy(&dst->range.level[0].cat); +out: + return rc; +} + static inline int mls_context_cmp(struct context *c1, struct context *c2) { + if (!selinux_mls_enabled) + return 1; + return ((c1->range.level[0].sens == c2->range.level[0].sens) && ebitmap_cmp(&c1->range.level[0].cat,&c2->range.level[0].cat) && (c1->range.level[1].sens == c2->range.level[1].sens) && @@ -65,27 +91,14 @@ static inline int mls_context_cmp(struct context *c1, struct context *c2) static inline void mls_context_destroy(struct context *c) { + if (!selinux_mls_enabled) + return; + ebitmap_destroy(&c->range.level[0].cat); ebitmap_destroy(&c->range.level[1].cat); mls_context_init(c); } -#else - -static inline void mls_context_init(struct context *c) -{ } - -static inline int mls_context_cpy(struct context *dst, struct context *src) -{ return 0; } - -static inline int mls_context_cmp(struct context *c1, struct context *c2) -{ return 1; } - -static inline void mls_context_destroy(struct context *c) -{ } - -#endif - static inline void context_init(struct context *c) { memset(c, 0, sizeof(*c));