diff options
Diffstat (limited to 'security/selinux/ss')
| -rw-r--r-- | security/selinux/ss/ebitmap.c | 2 | ||||
| -rw-r--r-- | security/selinux/ss/services.c | 70 | 
2 files changed, 23 insertions, 49 deletions
diff --git a/security/selinux/ss/ebitmap.c b/security/selinux/ss/ebitmap.c index 57644b1dc42e..894b6cdc11c5 100644 --- a/security/selinux/ss/ebitmap.c +++ b/security/selinux/ss/ebitmap.c @@ -165,7 +165,7 @@ int ebitmap_netlbl_import(struct ebitmap *ebmap,  			e_iter = kzalloc(sizeof(*e_iter), GFP_ATOMIC);  			if (e_iter == NULL)  				goto netlbl_import_failure; -			e_iter->startbit = offset & ~(EBITMAP_SIZE - 1); +			e_iter->startbit = offset - (offset % EBITMAP_SIZE);  			if (e_prev == NULL)  				ebmap->node = e_iter;  			else diff --git a/security/selinux/ss/services.c b/security/selinux/ss/services.c index 89df64672b89..082b20c78363 100644 --- a/security/selinux/ss/services.c +++ b/security/selinux/ss/services.c @@ -543,7 +543,7 @@ static void type_attribute_bounds_av(struct context *scontext,  				     struct av_decision *avd)  {  	struct context lo_scontext; -	struct context lo_tcontext; +	struct context lo_tcontext, *tcontextp = tcontext;  	struct av_decision lo_avd;  	struct type_datum *source;  	struct type_datum *target; @@ -553,67 +553,41 @@ static void type_attribute_bounds_av(struct context *scontext,  				    scontext->type - 1);  	BUG_ON(!source); +	if (!source->bounds) +		return; +  	target = flex_array_get_ptr(policydb.type_val_to_struct_array,  				    tcontext->type - 1);  	BUG_ON(!target); -	if (source->bounds) { -		memset(&lo_avd, 0, sizeof(lo_avd)); - -		memcpy(&lo_scontext, scontext, sizeof(lo_scontext)); -		lo_scontext.type = source->bounds; +	memset(&lo_avd, 0, sizeof(lo_avd)); -		context_struct_compute_av(&lo_scontext, -					  tcontext, -					  tclass, -					  &lo_avd, -					  NULL); -		if ((lo_avd.allowed & avd->allowed) == avd->allowed) -			return;		/* no masked permission */ -		masked = ~lo_avd.allowed & avd->allowed; -	} +	memcpy(&lo_scontext, scontext, sizeof(lo_scontext)); +	lo_scontext.type = source->bounds;  	if (target->bounds) { -		memset(&lo_avd, 0, sizeof(lo_avd)); -  		memcpy(&lo_tcontext, tcontext, sizeof(lo_tcontext));  		lo_tcontext.type = target->bounds; - -		context_struct_compute_av(scontext, -					  &lo_tcontext, -					  tclass, -					  &lo_avd, -					  NULL); -		if ((lo_avd.allowed & avd->allowed) == avd->allowed) -			return;		/* no masked permission */ -		masked = ~lo_avd.allowed & avd->allowed; +		tcontextp = &lo_tcontext;  	} -	if (source->bounds && target->bounds) { -		memset(&lo_avd, 0, sizeof(lo_avd)); -		/* -		 * lo_scontext and lo_tcontext are already -		 * set up. -		 */ +	context_struct_compute_av(&lo_scontext, +				  tcontextp, +				  tclass, +				  &lo_avd, +				  NULL); -		context_struct_compute_av(&lo_scontext, -					  &lo_tcontext, -					  tclass, -					  &lo_avd, -					  NULL); -		if ((lo_avd.allowed & avd->allowed) == avd->allowed) -			return;		/* no masked permission */ -		masked = ~lo_avd.allowed & avd->allowed; -	} +	masked = ~lo_avd.allowed & avd->allowed; -	if (masked) { -		/* mask violated permissions */ -		avd->allowed &= ~masked; +	if (likely(!masked)) +		return;		/* no masked permission */ -		/* audit masked permissions */ -		security_dump_masked_av(scontext, tcontext, -					tclass, masked, "bounds"); -	} +	/* mask violated permissions */ +	avd->allowed &= ~masked; + +	/* audit masked permissions */ +	security_dump_masked_av(scontext, tcontext, +				tclass, masked, "bounds");  }  /*  |