diff options
Diffstat (limited to 'security/selinux/ss/mls.c')
| -rw-r--r-- | security/selinux/ss/mls.c | 80 | 
1 files changed, 50 insertions, 30 deletions
diff --git a/security/selinux/ss/mls.c b/security/selinux/ss/mls.c index b4eff7a60c5..d307b37ddc2 100644 --- a/security/selinux/ss/mls.c +++ b/security/selinux/ss/mls.c @@ -11,7 +11,7 @@   * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.   */  /* - * Updated: Hewlett-Packard <paul.moore@hp.com> + * Updated: Hewlett-Packard <paul@paul-moore.com>   *   *      Added support to import/export the MLS label from NetLabel   * @@ -45,7 +45,7 @@ int mls_compute_context_len(struct context *context)  	len = 1; /* for the beginning ":" */  	for (l = 0; l < 2; l++) {  		int index_sens = context->range.level[l].sens; -		len += strlen(policydb.p_sens_val_to_name[index_sens - 1]); +		len += strlen(sym_name(&policydb, SYM_LEVELS, index_sens - 1));  		/* categories */  		head = -2; @@ -55,17 +55,17 @@ int mls_compute_context_len(struct context *context)  			if (i - prev > 1) {  				/* one or more negative bits are skipped */  				if (head != prev) { -					nm = policydb.p_cat_val_to_name[prev]; +					nm = sym_name(&policydb, SYM_CATS, prev);  					len += strlen(nm) + 1;  				} -				nm = policydb.p_cat_val_to_name[i]; +				nm = sym_name(&policydb, SYM_CATS, i);  				len += strlen(nm) + 1;  				head = i;  			}  			prev = i;  		}  		if (prev != head) { -			nm = policydb.p_cat_val_to_name[prev]; +			nm = sym_name(&policydb, SYM_CATS, prev);  			len += strlen(nm) + 1;  		}  		if (l == 0) { @@ -102,8 +102,8 @@ void mls_sid_to_context(struct context *context,  	scontextp++;  	for (l = 0; l < 2; l++) { -		strcpy(scontextp, -		       policydb.p_sens_val_to_name[context->range.level[l].sens - 1]); +		strcpy(scontextp, sym_name(&policydb, SYM_LEVELS, +					   context->range.level[l].sens - 1));  		scontextp += strlen(scontextp);  		/* categories */ @@ -118,7 +118,7 @@ void mls_sid_to_context(struct context *context,  						*scontextp++ = '.';  					else  						*scontextp++ = ','; -					nm = policydb.p_cat_val_to_name[prev]; +					nm = sym_name(&policydb, SYM_CATS, prev);  					strcpy(scontextp, nm);  					scontextp += strlen(nm);  				} @@ -126,7 +126,7 @@ void mls_sid_to_context(struct context *context,  					*scontextp++ = ':';  				else  					*scontextp++ = ','; -				nm = policydb.p_cat_val_to_name[i]; +				nm = sym_name(&policydb, SYM_CATS, i);  				strcpy(scontextp, nm);  				scontextp += strlen(nm);  				head = i; @@ -139,7 +139,7 @@ void mls_sid_to_context(struct context *context,  				*scontextp++ = '.';  			else  				*scontextp++ = ','; -			nm = policydb.p_cat_val_to_name[prev]; +			nm = sym_name(&policydb, SYM_CATS, prev);  			strcpy(scontextp, nm);  			scontextp += strlen(nm);  		} @@ -160,29 +160,21 @@ void mls_sid_to_context(struct context *context,  int mls_level_isvalid(struct policydb *p, struct mls_level *l)  {  	struct level_datum *levdatum; -	struct ebitmap_node *node; -	int i;  	if (!l->sens || l->sens > p->p_levels.nprim)  		return 0;  	levdatum = hashtab_search(p->p_levels.table, -				  p->p_sens_val_to_name[l->sens - 1]); +				  sym_name(p, SYM_LEVELS, l->sens - 1));  	if (!levdatum)  		return 0; -	ebitmap_for_each_positive_bit(&l->cat, node, i) { -		if (i > p->p_cats.nprim) -			return 0; -		if (!ebitmap_get_bit(&levdatum->level->cat, i)) { -			/* -			 * Category may not be associated with -			 * sensitivity. -			 */ -			return 0; -		} -	} - -	return 1; +	/* +	 * Return 1 iff all the bits set in l->cat are also be set in +	 * levdatum->level->cat and no bit in l->cat is larger than +	 * p->p_cats.nprim. +	 */ +	return ebitmap_contains(&levdatum->level->cat, &l->cat, +				p->p_cats.nprim);  }  int mls_range_isvalid(struct policydb *p, struct mls_range *r) @@ -482,7 +474,8 @@ int mls_convert_context(struct policydb *oldp,  	for (l = 0; l < 2; l++) {  		levdatum = hashtab_search(newp->p_levels.table, -			oldp->p_sens_val_to_name[c->range.level[l].sens - 1]); +					  sym_name(oldp, SYM_LEVELS, +						   c->range.level[l].sens - 1));  		if (!levdatum)  			return -EINVAL; @@ -493,12 +486,14 @@ int mls_convert_context(struct policydb *oldp,  			int rc;  			catdatum = hashtab_search(newp->p_cats.table, -						  oldp->p_cat_val_to_name[i]); +						  sym_name(oldp, SYM_CATS, i));  			if (!catdatum)  				return -EINVAL;  			rc = ebitmap_set_bit(&bitmap, catdatum->value - 1, 1);  			if (rc)  				return rc; + +			cond_resched();  		}  		ebitmap_destroy(&c->range.level[l].cat);  		c->range.level[l].cat = bitmap; @@ -511,10 +506,13 @@ int mls_compute_sid(struct context *scontext,  		    struct context *tcontext,  		    u16 tclass,  		    u32 specified, -		    struct context *newcontext) +		    struct context *newcontext, +		    bool sock)  {  	struct range_trans rtr;  	struct mls_range *r; +	struct class_datum *cladatum; +	int default_range = 0;  	if (!policydb.mls_enabled)  		return 0; @@ -528,9 +526,31 @@ int mls_compute_sid(struct context *scontext,  		r = hashtab_search(policydb.range_tr, &rtr);  		if (r)  			return mls_range_set(newcontext, r); + +		if (tclass && tclass <= policydb.p_classes.nprim) { +			cladatum = policydb.class_val_to_struct[tclass - 1]; +			if (cladatum) +				default_range = cladatum->default_range; +		} + +		switch (default_range) { +		case DEFAULT_SOURCE_LOW: +			return mls_context_cpy_low(newcontext, scontext); +		case DEFAULT_SOURCE_HIGH: +			return mls_context_cpy_high(newcontext, scontext); +		case DEFAULT_SOURCE_LOW_HIGH: +			return mls_context_cpy(newcontext, scontext); +		case DEFAULT_TARGET_LOW: +			return mls_context_cpy_low(newcontext, tcontext); +		case DEFAULT_TARGET_HIGH: +			return mls_context_cpy_high(newcontext, tcontext); +		case DEFAULT_TARGET_LOW_HIGH: +			return mls_context_cpy(newcontext, tcontext); +		} +  		/* Fallthrough */  	case AVTAB_CHANGE: -		if (tclass == policydb.process_class) +		if ((tclass == policydb.process_class) || (sock == true))  			/* Use the process MLS attributes. */  			return mls_context_cpy(newcontext, scontext);  		else  | 
