libsepol: Write and read TUNABLE flags in related data structures.

All flags in cond_bool_datum_t and cond_node_t structures are written
or read for policy modules which version is no less than
MOD_POLICYDB_VERSION_TUNABLE_SEP.

Note, for cond_node_t the TUNABLE flag bit would be used only at expand,
however, it won't hurt to read/write this field for modules(potentially
for future usage).

Signed-off-by: Harry Ciao <qingtao.cao@windriver.com>
Signed-off-by: Eric Paris <eparis@redhat.com>
Acked-by: Dan Walsh <dwalsh@redhat.com>
This commit is contained in:
Harry Ciao 2011-09-01 11:29:42 +08:00 committed by Eric Paris
parent 80f26c5ee8
commit b0be2a06b7
2 changed files with 37 additions and 2 deletions

View File

@ -564,8 +564,8 @@ static int bool_isvalid(cond_bool_datum_t * b)
return 1;
}
int cond_read_bool(policydb_t * p
__attribute__ ((unused)), hashtab_t h,
int cond_read_bool(policydb_t * p,
hashtab_t h,
struct policy_file *fp)
{
char *key = 0;
@ -597,6 +597,15 @@ int cond_read_bool(policydb_t * p
if (rc < 0)
goto err;
key[len] = 0;
if (p->policy_type != POLICY_KERN &&
p->policyvers >= MOD_POLICYDB_VERSION_TUNABLE_SEP) {
rc = next_entry(buf, fp, sizeof(uint32_t));
if (rc < 0)
goto err;
booldatum->flags = le32_to_cpu(buf[0]);
}
if (hashtab_insert(h, key, booldatum))
goto err;
@ -811,6 +820,14 @@ static int cond_read_node(policydb_t * p, cond_node_t * node, void *fp)
goto err;
}
if (p->policy_type != POLICY_KERN &&
p->policyvers >= MOD_POLICYDB_VERSION_TUNABLE_SEP) {
rc = next_entry(buf, fp, sizeof(uint32_t));
if (rc < 0)
goto err;
node->flags = le32_to_cpu(buf[0]);
}
return 0;
err:
cond_node_destroy(node);

View File

@ -607,6 +607,7 @@ static int cond_write_bool(hashtab_key_t key, hashtab_datum_t datum, void *ptr)
unsigned int items, items2;
struct policy_data *pd = ptr;
struct policy_file *fp = pd->fp;
struct policydb *p = pd->p;
booldatum = (cond_bool_datum_t *) datum;
@ -621,6 +622,15 @@ static int cond_write_bool(hashtab_key_t key, hashtab_datum_t datum, void *ptr)
items = put_entry(key, 1, len, fp);
if (items != len)
return POLICYDB_ERROR;
if (p->policy_type != POLICY_KERN &&
p->policyvers >= MOD_POLICYDB_VERSION_TUNABLE_SEP) {
buf[0] = cpu_to_le32(booldatum->flags);
items = put_entry(buf, sizeof(uint32_t), 1, fp);
if (items != 1)
return POLICYDB_ERROR;
}
return POLICYDB_SUCCESS;
}
@ -727,6 +737,14 @@ static int cond_write_node(policydb_t * p,
return POLICYDB_ERROR;
}
if (p->policy_type != POLICY_KERN &&
p->policyvers >= MOD_POLICYDB_VERSION_TUNABLE_SEP) {
buf[0] = cpu_to_le32(node->flags);
items = put_entry(buf, sizeof(uint32_t), 1, fp);
if (items != 1)
return POLICYDB_ERROR;
}
return POLICYDB_SUCCESS;
}