Re: [PATCH] SELinux: V2-Update policy version to support constraints info

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

 



On Friday, November 01, 2013 08:11:14 AM Stephen Smalley wrote:
> On 11/01/2013 07:40 AM, Richard Haines wrote:
> > Update the policy version (POLICYDB_VERSION_CONSTRAINT_NAMES) to allow
> > holding of policy source info for constraints.
> > 
> > Signed-off-by: Richard Haines <richard_c_haines@xxxxxxxxxxxxxx>
> 
> Thanks!
> 
> Acked-by:  Stephen Smalley <sds@xxxxxxxxxxxxx>

Applied, thanks.  However, I'm not pushing to up to my SELinux tree until 
after 3.13-rc1 is released.

> > ---
> > 
> >  security/selinux/include/security.h |  3 +-
> >  security/selinux/ss/constraint.h    |  1 +
> >  security/selinux/ss/policydb.c      | 96
> >  +++++++++++++++++++++++++++++++++---- security/selinux/ss/policydb.h    
> >   | 11 +++++
> >  4 files changed, 101 insertions(+), 10 deletions(-)
> > 
> > diff --git a/security/selinux/include/security.h
> > b/security/selinux/include/security.h index 927fc14..bdf0a56 100644
> > --- a/security/selinux/include/security.h
> > +++ b/security/selinux/include/security.h
> > @@ -33,13 +33,14 @@
> > 
> >  #define POLICYDB_VERSION_ROLETRANS	26
> >  #define POLICYDB_VERSION_NEW_OBJECT_DEFAULTS	27
> >  #define POLICYDB_VERSION_DEFAULT_TYPE	28
> > 
> > +#define POLICYDB_VERSION_CONSTRAINT_NAMES	29
> > 
> >  /* Range of policy versions we understand*/
> >  #define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
> >  #ifdef CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX
> >  #define
> >  POLICYDB_VERSION_MAX	CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX_VALUE
> >  #else
> > 
> > -#define POLICYDB_VERSION_MAX	POLICYDB_VERSION_DEFAULT_TYPE
> > +#define POLICYDB_VERSION_MAX	POLICYDB_VERSION_CONSTRAINT_NAMES
> > 
> >  #endif
> >  
> >  /* Mask for just the mount related flags */
> > 
> > diff --git a/security/selinux/ss/constraint.h
> > b/security/selinux/ss/constraint.h index 149dda7..96fd947 100644
> > --- a/security/selinux/ss/constraint.h
> > +++ b/security/selinux/ss/constraint.h
> > @@ -48,6 +48,7 @@ struct constraint_expr {
> > 
> >  	u32 op;			/* operator */
> >  	
> >  	struct ebitmap names;	/* names */
> > 
> > +	struct type_set *type_names;
> > 
> >  	struct constraint_expr *next;   /* next expression */
> >  
> >  };
> > 
> > diff --git a/security/selinux/ss/policydb.c
> > b/security/selinux/ss/policydb.c index 9cd9b7c..60af34a 100644
> > --- a/security/selinux/ss/policydb.c
> > +++ b/security/selinux/ss/policydb.c
> > @@ -143,6 +143,11 @@ static struct policydb_compat_info policydb_compat[]
> > = {> 
> >  		.sym_num	= SYM_NUM,
> >  		.ocon_num	= OCON_NUM,
> >  	
> >  	},
> > 
> > +	{
> > +		.version	= POLICYDB_VERSION_CONSTRAINT_NAMES,
> > +		.sym_num	= SYM_NUM,
> > +		.ocon_num	= OCON_NUM,
> > +	},
> > 
> >  };
> >  
> >  static struct policydb_compat_info *policydb_lookup_compat(int version)
> > 
> > @@ -613,6 +618,19 @@ static int common_destroy(void *key, void *datum,
> > void *p)> 
> >  	return 0;
> >  
> >  }
> > 
> > +static void constraint_expr_destroy(struct constraint_expr *expr)
> > +{
> > +	if (expr) {
> > +		ebitmap_destroy(&expr->names);
> > +		if (expr->type_names) {
> > +			ebitmap_destroy(&expr->type_names->types);
> > +			ebitmap_destroy(&expr->type_names->negset);
> > +			kfree(expr->type_names);
> > +		}
> > +		kfree(expr);
> > +	}
> > +}
> > +
> > 
> >  static int cls_destroy(void *key, void *datum, void *p)
> >  {
> >  
> >  	struct class_datum *cladatum;
> > 
> > @@ -628,10 +646,9 @@ static int cls_destroy(void *key, void *datum, void
> > *p)> 
> >  		while (constraint) {
> >  		
> >  			e = constraint->expr;
> >  			while (e) {
> > 
> > -				ebitmap_destroy(&e->names);
> > 
> >  				etmp = e;
> >  				e = e->next;
> > 
> > -				kfree(etmp);
> > +				constraint_expr_destroy(etmp);
> > 
> >  			}
> >  			ctemp = constraint;
> >  			constraint = constraint->next;
> > 
> > @@ -642,16 +659,14 @@ static int cls_destroy(void *key, void *datum, void
> > *p)> 
> >  		while (constraint) {
> >  		
> >  			e = constraint->expr;
> >  			while (e) {
> > 
> > -				ebitmap_destroy(&e->names);
> > 
> >  				etmp = e;
> >  				e = e->next;
> > 
> > -				kfree(etmp);
> > +				constraint_expr_destroy(etmp);
> > 
> >  			}
> >  			ctemp = constraint;
> >  			constraint = constraint->next;
> >  			kfree(ctemp);
> >  		
> >  		}
> > 
> > -
> > 
> >  		kfree(cladatum->comkey);
> >  	
> >  	}
> >  	kfree(datum);
> > 
> > @@ -1156,8 +1171,34 @@ bad:
> >  	return rc;
> >  
> >  }
> > 
> > -static int read_cons_helper(struct constraint_node **nodep, int ncons,
> > -			    int allowxtarget, void *fp)
> > +static void type_set_init(struct type_set *t)
> > +{
> > +	ebitmap_init(&t->types);
> > +	ebitmap_init(&t->negset);
> > +}
> > +
> > +static int type_set_read(struct type_set *t, void *fp)
> > +{
> > +	__le32 buf[1];
> > +	int rc;
> > +
> > +	if (ebitmap_read(&t->types, fp))
> > +		return -EINVAL;
> > +	if (ebitmap_read(&t->negset, fp))
> > +		return -EINVAL;
> > +
> > +	rc = next_entry(buf, fp, sizeof(u32));
> > +	if (rc < 0)
> > +		return -EINVAL;
> > +	t->flags = le32_to_cpu(buf[0]);
> > +
> > +	return 0;
> > +}
> > +
> > +
> > +static int read_cons_helper(struct policydb *p,
> > +				struct constraint_node **nodep,
> > +				int ncons, int allowxtarget, void *fp)
> > 
> >  {
> >  
> >  	struct constraint_node *c, *lc;
> >  	struct constraint_expr *e, *le;
> > 
> > @@ -1225,6 +1266,18 @@ static int read_cons_helper(struct constraint_node
> > **nodep, int ncons,> 
> >  				rc = ebitmap_read(&e->names, fp);
> >  				if (rc)
> >  				
> >  					return rc;
> > 
> > +				if (p->policyvers >=
> > +					POLICYDB_VERSION_CONSTRAINT_NAMES) {
> > +						e->type_names = kzalloc(sizeof
> > +						(*e->type_names),
> > +						GFP_KERNEL);
> > +					if (!e->type_names)
> > +						return -ENOMEM;
> > +					type_set_init(e->type_names);
> > +					rc = type_set_read(e->type_names, fp);
> > +					if (rc)
> > +						return rc;
> > +				}
> > 
> >  				break;
> >  			
> >  			default:
> >  				return -EINVAL;
> > 
> > @@ -1301,7 +1354,7 @@ static int class_read(struct policydb *p, struct
> > hashtab *h, void *fp)> 
> >  			goto bad;
> >  	
> >  	}
> > 
> > -	rc = read_cons_helper(&cladatum->constraints, ncons, 0, fp);
> > +	rc = read_cons_helper(p, &cladatum->constraints, ncons, 0, fp);
> > 
> >  	if (rc)
> >  	
> >  		goto bad;
> > 
> > @@ -1311,7 +1364,8 @@ static int class_read(struct policydb *p, struct
> > hashtab *h, void *fp)> 
> >  		if (rc)
> >  		
> >  			goto bad;
> >  		
> >  		ncons = le32_to_cpu(buf[0]);
> > 
> > -		rc = read_cons_helper(&cladatum->validatetrans, ncons, 1, fp);
> > +		rc = read_cons_helper(p, &cladatum->validatetrans,
> > +				ncons, 1, fp);
> > 
> >  		if (rc)
> >  		
> >  			goto bad;
> >  	
> >  	}
> > 
> > @@ -2750,6 +2804,24 @@ static int common_write(void *vkey, void *datum,
> > void *ptr)> 
> >  	return 0;
> >  
> >  }
> > 
> > +static int type_set_write(struct type_set *t, void *fp)
> > +{
> > +	int rc;
> > +	__le32 buf[1];
> > +
> > +	if (ebitmap_write(&t->types, fp))
> > +		return -EINVAL;
> > +	if (ebitmap_write(&t->negset, fp))
> > +		return -EINVAL;
> > +
> > +	buf[0] = cpu_to_le32(t->flags);
> > +	rc = put_entry(buf, sizeof(u32), 1, fp);
> > +	if (rc)
> > +		return -EINVAL;
> > +
> > +	return 0;
> > +}
> > +
> > 
> >  static int write_cons_helper(struct policydb *p, struct constraint_node
> >  *node,>  
> >  			     void *fp)
> >  
> >  {
> > 
> > @@ -2781,6 +2853,12 @@ static int write_cons_helper(struct policydb *p,
> > struct constraint_node *node,> 
> >  				rc = ebitmap_write(&e->names, fp);
> >  				if (rc)
> >  				
> >  					return rc;
> > 
> > +				if (p->policyvers >=
> > +					POLICYDB_VERSION_CONSTRAINT_NAMES) {
> > +					rc = type_set_write(e->type_names, fp);
> > +					if (rc)
> > +						return rc;
> > +				}
> > 
> >  				break;
> >  			
> >  			default:
> >  				break;
> > 
> > diff --git a/security/selinux/ss/policydb.h
> > b/security/selinux/ss/policydb.h index da63747..725d594 100644
> > --- a/security/selinux/ss/policydb.h
> > +++ b/security/selinux/ss/policydb.h
> > @@ -154,6 +154,17 @@ struct cond_bool_datum {
> > 
> >  struct cond_node;
> >  
> >  /*
> > 
> > + * type set preserves data needed to determine constraint info from
> > + * policy source. This is not used by the kernel policy but allows
> > + * utilities such as audit2allow to determine constraint denials.
> > + */
> > +struct type_set {
> > +	struct ebitmap types;
> > +	struct ebitmap negset;
> > +	u32 flags;
> > +};
> > +
> > +/*
> > 
> >   * The configuration data includes security contexts for
> >   * initial SIDs, unlabeled file systems, TCP and UDP port numbers,
> >   * network interfaces, and nodes.  This structure stores the

-- 
paul moore
www.paul-moore.com


--
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