diff options
Diffstat (limited to 'security/selinux/xfrm.c')
| -rw-r--r-- | security/selinux/xfrm.c | 39 | 
1 files changed, 35 insertions, 4 deletions
diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c index abe99d88137..0e24df41099 100644 --- a/security/selinux/xfrm.c +++ b/security/selinux/xfrm.c @@ -132,10 +132,7 @@ static int selinux_xfrm_sec_ctx_alloc(struct xfrm_sec_ctx **ctxp, struct xfrm_us  		goto out;  	/* -	 * Does the subject have permission to set security or permission to -	 * do the relabel? -	 * Must be permitted to relabel from default socket type (process type) -	 * to specified context +	 * Does the subject have permission to set security context?  	 */  	rc = avc_has_perm(tsec->sid, ctx->ctx_sid,  			  SECCLASS_ASSOCIATION, @@ -201,6 +198,23 @@ void selinux_xfrm_policy_free(struct xfrm_policy *xp)  }  /* + * LSM hook implementation that authorizes deletion of labeled policies. + */ +int selinux_xfrm_policy_delete(struct xfrm_policy *xp) +{ +	struct task_security_struct *tsec = current->security; +	struct xfrm_sec_ctx *ctx = xp->security; +	int rc = 0; + +	if (ctx) +		rc = avc_has_perm(tsec->sid, ctx->ctx_sid, +				  SECCLASS_ASSOCIATION, +				  ASSOCIATION__SETCONTEXT, NULL); + +	return rc; +} + +/*   * LSM hook implementation that allocs and transfers sec_ctx spec to   * xfrm_state.   */ @@ -292,6 +306,23 @@ u32 selinux_socket_getpeer_dgram(struct sk_buff *skb)  	return SECSID_NULL;  } + /* +  * LSM hook implementation that authorizes deletion of labeled SAs. +  */ +int selinux_xfrm_state_delete(struct xfrm_state *x) +{ +	struct task_security_struct *tsec = current->security; +	struct xfrm_sec_ctx *ctx = x->security; +	int rc = 0; + +	if (ctx) +		rc = avc_has_perm(tsec->sid, ctx->ctx_sid, +				  SECCLASS_ASSOCIATION, +				  ASSOCIATION__SETCONTEXT, NULL); + +	return rc; +} +  /*   * LSM hook that controls access to unlabelled packets.  If   * a xfrm_state is authorizable (defined by macro) then it was  |