Re: Trying to get XAce policy straightened out but our tool chain is too broken to handle it.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2008-07-03 at 11:18 -0400, Joshua Brindle wrote:
> Joshua Brindle wrote:
> > Stephen Smalley wrote:
> >> On Wed, 2008-06-25 at 14:28 -0400, Eamon Walsh wrote:
> >>> Christopher J. PeBenito wrote:
> >>>> On Mon, 2008-06-23 at 07:17 -0400, Daniel J Walsh wrote:
> >>>>   
> >>>>> Stephen Smalley wrote:
> >>>>>     
> >>>>>> On Thu, 2008-06-05 at 11:11 -0400, Daniel J Walsh wrote:
> >>>>>>       
> >>>>   
> >>>>>>> The problem I have is the compiler is too stupid to understand the
> >>>>>>> differences between a gen_requires block defining the required types and
> >>>>>>> the actual type definition.
> >>>>>>>
> >>>>>>> So I end up in a catch 22 where the compiler tells me I need to require
> >>>>>>> $1_rootwindow_t, but if I gen_require type $1_rootwindow_t, it tells me
> >>>>>>> I have a duplicate definition.
> >>>>>>>
> >>>>>>> So if you have a derived type in a gen_requires block the compiler can
> >>>>>>> not handle it.
> >>>>>>>         
> >>>>>> I'm a little unclear as to why this is required (why do you need to
> >>>>>> require and declare the same symbol again?).  However, is there some
> >>>>>> reason we can't just automatically promote a require to a declaration
> >>>>>> upon encountering the latter?  Seems like we've talked about this
> >>>>>> before.  Not sure whether that should happen within libsepol
> >>>>>> symtab_insert() or in the callers, e.g. declare_type().
> >>>>>>
> >>>>>>       
> >>>>> I don't know,  All I know is the compiler complains if it is there and
> >>>>> if it is not there.  Catch 22.  I end up going to great lengths to hack
> >>>>> around compiler errors...
> >>>>>     
> >>>> We add requires to templates, so that if they're used outside xserver,
> >>>> the caller gets the appropriate require.  But then we also use the
> >>>> template inside xserver for code reuse, which is where the problem
> >>>> creeps up.  There are a couple other examples of this in refpolicy, but
> >>>> I was able to work around them by reordering statements.  It sounds like
> >>>> Dan's situation may not be something that can be easily worked around
> >>>> without some restructuring
> >>> I opened a ticket in the refpolicy Trac for this:   
> >>> http://oss.tresys.com/projects/refpolicy/ticket/43
> >> Ok - although I was thinking that this would be fixed by changing
> >> checkpolicy/libsepol to promote requires to decls upon encountering a
> >> decl.  Joshua?
> >>
> > 
> > I believe this fixes it but I'm still testing for corner cases and such. The require and declare still have to be in the same scope, eg:
> > 
> > optional {
> > 	require {
> > 		type foo;
> > 	}
> > 	type bar;
> > }
> > 
> > require {
> > 	type bar;
> > }
> > 
> > does not work but the standard use case of:
> > 
> > require {
> > 	type foo;
> > }
> > 
> > type foo;
> > 
> > does work.
> > 
> 
> I've done some more testing and think this patch is correct, if noone
> has objections I'll merge it in later today.

Acked-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>

Merge at will.

> 
> > -------
> > 
> > Index: libsepol/src/policydb.c
> > ===================================================================
> > --- libsepol/src/policydb.c	(revision 2916)
> > +++ libsepol/src/policydb.c	(working copy)
> > @@ -1215,21 +1215,13 @@
> >  	/* FIX ME - the failures after the hashtab_insert will leave
> >  	 * the policy in a inconsistent state. */
> >  	rc = hashtab_insert(pol->symtab[sym].table, key, datum);
> > -	if (rc == 0) {
> > +	if (rc == SEPOL_OK) {
> >  		/* if no value is passed in the symbol is not primary
> >  		 * (i.e. aliases) */
> >  		if (value)
> >  			*value = ++pol->symtab[sym].nprim;
> > -	} else if (rc == SEPOL_EEXIST && scope == SCOPE_REQ) {
> > +	} else if (rc == SEPOL_EEXIST) {
> >  		retval = 1;	/* symbol not added -- need to free() later */
> > -	} else if (rc == SEPOL_EEXIST && scope == SCOPE_DECL) {
> > -		if (sym == SYM_ROLES || sym == SYM_USERS) {
> > -			/* allow multiple declarations for these two */
> > -			retval = 1;
> > -		} else {
> > -			/* duplicate declarations not allowed for all else */
> > -			return -2;
> > -		}
> >  	} else {
> >  		return rc;
> >  	}
> > @@ -1256,21 +1248,15 @@
> >  			free(scope_datum);
> >  			return rc;
> >  		}
> > -	} else if (scope_datum->scope == SCOPE_DECL) {
> > +	} else if (scope_datum->scope == SCOPE_DECL && scope == SCOPE_DECL) {
> >  		/* disallow multiple declarations for non-roles/users */
> >  		if (sym != SYM_ROLES && sym != SYM_USERS) {
> >  			return -2;
> >  		}
> >  	} else if (scope_datum->scope == SCOPE_REQ && scope == SCOPE_DECL) {
> > -		/* appending to required symbol only allowed for roles/users */
> > -		if (sym == SYM_ROLES || sym == SYM_USERS) {
> > -			scope_datum->scope = SCOPE_DECL;
> > -		} else {
> > -			return -2;
> > -		}
> > -
> > +		scope_datum->scope = SCOPE_DECL;
> >  	} else if (scope_datum->scope != scope) {
> > -		/* scope does not match */
> > +		/* This only happens in DECL then REQUIRE case, which is handled by caller */
> >  		return -2;
> >  	}
> >  
> > 
> 
> 
> --
> This message was distributed to subscribers of the selinux mailing list.
> If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
> the words "unsubscribe selinux" without quotes as the message.
-- 
Stephen Smalley
National Security Agency


--
This message was distributed to subscribers of the selinux mailing list.
If you no longer wish to subscribe, send mail to majordomo@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux