diff options
Diffstat (limited to 'security/selinux/ss/policydb.c')
| -rw-r--r-- | security/selinux/ss/policydb.c | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c index a7f61d52f05..9cd9b7c661e 100644 --- a/security/selinux/ss/policydb.c +++ b/security/selinux/ss/policydb.c @@ -133,6 +133,16 @@ static struct policydb_compat_info policydb_compat[] = {  		.sym_num	= SYM_NUM,  		.ocon_num	= OCON_NUM,  	}, +	{ +		.version	= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS, +		.sym_num	= SYM_NUM, +		.ocon_num	= OCON_NUM, +	}, +	{ +		.version	= POLICYDB_VERSION_DEFAULT_TYPE, +		.sym_num	= SYM_NUM, +		.ocon_num	= OCON_NUM, +	},  };  static struct policydb_compat_info *policydb_lookup_compat(int version) @@ -1306,6 +1316,23 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)  			goto bad;  	} +	if (p->policyvers >= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS) { +		rc = next_entry(buf, fp, sizeof(u32) * 3); +		if (rc) +			goto bad; + +		cladatum->default_user = le32_to_cpu(buf[0]); +		cladatum->default_role = le32_to_cpu(buf[1]); +		cladatum->default_range = le32_to_cpu(buf[2]); +	} + +	if (p->policyvers >= POLICYDB_VERSION_DEFAULT_TYPE) { +		rc = next_entry(buf, fp, sizeof(u32) * 1); +		if (rc) +			goto bad; +		cladatum->default_type = le32_to_cpu(buf[0]); +	} +  	rc = hashtab_insert(h, key, cladatum);  	if (rc)  		goto bad; @@ -2832,6 +2859,23 @@ static int class_write(void *vkey, void *datum, void *ptr)  	if (rc)  		return rc; +	if (p->policyvers >= POLICYDB_VERSION_NEW_OBJECT_DEFAULTS) { +		buf[0] = cpu_to_le32(cladatum->default_user); +		buf[1] = cpu_to_le32(cladatum->default_role); +		buf[2] = cpu_to_le32(cladatum->default_range); + +		rc = put_entry(buf, sizeof(uint32_t), 3, fp); +		if (rc) +			return rc; +	} + +	if (p->policyvers >= POLICYDB_VERSION_DEFAULT_TYPE) { +		buf[0] = cpu_to_le32(cladatum->default_type); +		rc = put_entry(buf, sizeof(uint32_t), 1, fp); +		if (rc) +			return rc; +	} +  	return 0;  }  |