Commit 237389e3 authored by Ondrej Mosnacek's avatar Ondrej Mosnacek Committed by Paul Moore
Browse files

selinux: specialize symtab insert and search functions



This encapsulates symtab a little better and will help with further
refactoring later.

Signed-off-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
Acked-by: default avatarStephen Smalley <stephen.smalley.work@gmail.com>
Signed-off-by: default avatarPaul Moore <paul@paul-moore.com>
parent 2c3d8dfe
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -200,7 +200,7 @@ static int bool_isvalid(struct cond_bool_datum *b)
	return 1;
}

int cond_read_bool(struct policydb *p, struct hashtab *h, void *fp)
int cond_read_bool(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct cond_bool_datum *booldatum;
@@ -235,7 +235,7 @@ int cond_read_bool(struct policydb *p, struct hashtab *h, void *fp)
	if (rc)
		goto err;
	key[len] = '\0';
	rc = hashtab_insert(h, key, booldatum);
	rc = symtab_insert(s, key, booldatum);
	if (rc)
		goto err;

+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ int cond_destroy_bool(void *key, void *datum, void *p);

int cond_index_bool(void *key, void *datum, void *datap);

int cond_read_bool(struct policydb *p, struct hashtab *h, void *fp);
int cond_read_bool(struct policydb *p, struct symtab *s, void *fp);
int cond_read_list(struct policydb *p, void *fp);
int cond_write_bool(void *key, void *datum, void *ptr);
int cond_write_list(struct policydb *p, void *fp);
+11 −10
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ int mls_level_isvalid(struct policydb *p, struct mls_level *l)

	if (!l->sens || l->sens > p->p_levels.nprim)
		return 0;
	levdatum = hashtab_search(&p->p_levels.table,
	levdatum = symtab_search(&p->p_levels,
				 sym_name(p, SYM_LEVELS, l->sens - 1));
	if (!levdatum)
		return 0;
@@ -293,7 +293,7 @@ int mls_context_to_sid(struct policydb *pol,
			*(next_cat++) = '\0';

		/* Parse sensitivity. */
		levdatum = hashtab_search(&pol->p_levels.table, sensitivity);
		levdatum = symtab_search(&pol->p_levels, sensitivity);
		if (!levdatum)
			return -EINVAL;
		context->range.level[l].sens = levdatum->level->sens;
@@ -312,7 +312,7 @@ int mls_context_to_sid(struct policydb *pol,
				*rngptr++ = '\0';
			}

			catdatum = hashtab_search(&pol->p_cats.table, cur_cat);
			catdatum = symtab_search(&pol->p_cats, cur_cat);
			if (!catdatum)
				return -EINVAL;

@@ -325,7 +325,7 @@ int mls_context_to_sid(struct policydb *pol,
			if (rngptr == NULL)
				continue;

			rngdatum = hashtab_search(&pol->p_cats.table, rngptr);
			rngdatum = symtab_search(&pol->p_cats, rngptr);
			if (!rngdatum)
				return -EINVAL;

@@ -458,9 +458,10 @@ int mls_convert_context(struct policydb *oldp,
		return 0;

	for (l = 0; l < 2; l++) {
		levdatum = hashtab_search(&newp->p_levels.table,
					  sym_name(oldp, SYM_LEVELS,
						   oldc->range.level[l].sens - 1));
		char *name = sym_name(oldp, SYM_LEVELS,
				      oldc->range.level[l].sens - 1);

		levdatum = symtab_search(&newp->p_levels, name);

		if (!levdatum)
			return -EINVAL;
@@ -470,7 +471,7 @@ int mls_convert_context(struct policydb *oldp,
					      node, i) {
			int rc;

			catdatum = hashtab_search(&newp->p_cats.table,
			catdatum = symtab_search(&newp->p_cats,
						 sym_name(oldp, SYM_CATS, i));
			if (!catdatum)
				return -EINVAL;
+26 −26
Original line number Diff line number Diff line
@@ -400,7 +400,7 @@ static int roles_init(struct policydb *p)
	if (!key)
		goto out;

	rc = hashtab_insert(&p->p_roles.table, key, role);
	rc = symtab_insert(&p->p_roles, key, role);
	if (rc)
		goto out;

@@ -1065,7 +1065,7 @@ static int str_read(char **strp, gfp_t flags, void *fp, u32 len)
	return 0;
}

static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
static int perm_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct perm_datum *perdatum;
@@ -1088,7 +1088,7 @@ static int perm_read(struct policydb *p, struct hashtab *h, void *fp)
	if (rc)
		goto bad;

	rc = hashtab_insert(h, key, perdatum);
	rc = symtab_insert(s, key, perdatum);
	if (rc)
		goto bad;

@@ -1098,7 +1098,7 @@ bad:
	return rc;
}

static int common_read(struct policydb *p, struct hashtab *h, void *fp)
static int common_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct common_datum *comdatum;
@@ -1128,12 +1128,12 @@ static int common_read(struct policydb *p, struct hashtab *h, void *fp)
		goto bad;

	for (i = 0; i < nel; i++) {
		rc = perm_read(p, &comdatum->permissions.table, fp);
		rc = perm_read(p, &comdatum->permissions, fp);
		if (rc)
			goto bad;
	}

	rc = hashtab_insert(h, key, comdatum);
	rc = symtab_insert(s, key, comdatum);
	if (rc)
		goto bad;
	return 0;
@@ -1262,7 +1262,7 @@ static int read_cons_helper(struct policydb *p,
	return 0;
}

static int class_read(struct policydb *p, struct hashtab *h, void *fp)
static int class_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct class_datum *cladatum;
@@ -1300,7 +1300,7 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)
			goto bad;

		rc = -EINVAL;
		cladatum->comdatum = hashtab_search(&p->p_commons.table,
		cladatum->comdatum = symtab_search(&p->p_commons,
						   cladatum->comkey);
		if (!cladatum->comdatum) {
			pr_err("SELinux:  unknown common %s\n",
@@ -1309,7 +1309,7 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)
		}
	}
	for (i = 0; i < nel; i++) {
		rc = perm_read(p, &cladatum->permissions.table, fp);
		rc = perm_read(p, &cladatum->permissions, fp);
		if (rc)
			goto bad;
	}
@@ -1347,7 +1347,7 @@ static int class_read(struct policydb *p, struct hashtab *h, void *fp)
		cladatum->default_type = le32_to_cpu(buf[0]);
	}

	rc = hashtab_insert(h, key, cladatum);
	rc = symtab_insert(s, key, cladatum);
	if (rc)
		goto bad;

@@ -1357,7 +1357,7 @@ bad:
	return rc;
}

static int role_read(struct policydb *p, struct hashtab *h, void *fp)
static int role_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct role_datum *role;
@@ -1404,7 +1404,7 @@ static int role_read(struct policydb *p, struct hashtab *h, void *fp)
		goto bad;
	}

	rc = hashtab_insert(h, key, role);
	rc = symtab_insert(s, key, role);
	if (rc)
		goto bad;
	return 0;
@@ -1413,7 +1413,7 @@ bad:
	return rc;
}

static int type_read(struct policydb *p, struct hashtab *h, void *fp)
static int type_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct type_datum *typdatum;
@@ -1451,7 +1451,7 @@ static int type_read(struct policydb *p, struct hashtab *h, void *fp)
	if (rc)
		goto bad;

	rc = hashtab_insert(h, key, typdatum);
	rc = symtab_insert(s, key, typdatum);
	if (rc)
		goto bad;
	return 0;
@@ -1487,7 +1487,7 @@ static int mls_read_level(struct mls_level *lp, void *fp)
	return 0;
}

static int user_read(struct policydb *p, struct hashtab *h, void *fp)
static int user_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct user_datum *usrdatum;
@@ -1528,7 +1528,7 @@ static int user_read(struct policydb *p, struct hashtab *h, void *fp)
			goto bad;
	}

	rc = hashtab_insert(h, key, usrdatum);
	rc = symtab_insert(s, key, usrdatum);
	if (rc)
		goto bad;
	return 0;
@@ -1537,7 +1537,7 @@ bad:
	return rc;
}

static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
static int sens_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct level_datum *levdatum;
@@ -1569,7 +1569,7 @@ static int sens_read(struct policydb *p, struct hashtab *h, void *fp)
	if (rc)
		goto bad;

	rc = hashtab_insert(h, key, levdatum);
	rc = symtab_insert(s, key, levdatum);
	if (rc)
		goto bad;
	return 0;
@@ -1578,7 +1578,7 @@ bad:
	return rc;
}

static int cat_read(struct policydb *p, struct hashtab *h, void *fp)
static int cat_read(struct policydb *p, struct symtab *s, void *fp)
{
	char *key = NULL;
	struct cat_datum *catdatum;
@@ -1602,7 +1602,7 @@ static int cat_read(struct policydb *p, struct hashtab *h, void *fp)
	if (rc)
		goto bad;

	rc = hashtab_insert(h, key, catdatum);
	rc = symtab_insert(s, key, catdatum);
	if (rc)
		goto bad;
	return 0;
@@ -1611,7 +1611,7 @@ bad:
	return rc;
}

static int (*read_f[SYM_NUM]) (struct policydb *p, struct hashtab *h, void *fp) =
static int (*read_f[SYM_NUM]) (struct policydb *p, struct symtab *s, void *fp) =
{
	common_read,
	class_read,
@@ -1751,7 +1751,7 @@ u16 string_to_security_class(struct policydb *p, const char *name)
{
	struct class_datum *cladatum;

	cladatum = hashtab_search(&p->p_classes.table, name);
	cladatum = symtab_search(&p->p_classes, name);
	if (!cladatum)
		return 0;

@@ -1770,9 +1770,9 @@ u32 string_to_av_perm(struct policydb *p, u16 tclass, const char *name)
	cladatum = p->class_val_to_struct[tclass-1];
	comdatum = cladatum->comdatum;
	if (comdatum)
		perdatum = hashtab_search(&comdatum->permissions.table, name);
		perdatum = symtab_search(&comdatum->permissions, name);
	if (!perdatum)
		perdatum = hashtab_search(&cladatum->permissions.table, name);
		perdatum = symtab_search(&cladatum->permissions, name);
	if (!perdatum)
		return 0;

@@ -2509,7 +2509,7 @@ int policydb_read(struct policydb *p, void *fp)
		}

		for (j = 0; j < nel; j++) {
			rc = read_f[i](p, &p->symtab[i].table, fp);
			rc = read_f[i](p, &p->symtab[i], fp);
			if (rc)
				goto bad;
		}
+17 −17
Original line number Diff line number Diff line
@@ -1441,7 +1441,7 @@ static int string_to_context_struct(struct policydb *pol,

	*p++ = 0;

	usrdatum = hashtab_search(&pol->p_users.table, scontextp);
	usrdatum = symtab_search(&pol->p_users, scontextp);
	if (!usrdatum)
		goto out;

@@ -1457,7 +1457,7 @@ static int string_to_context_struct(struct policydb *pol,

	*p++ = 0;

	role = hashtab_search(&pol->p_roles.table, scontextp);
	role = symtab_search(&pol->p_roles, scontextp);
	if (!role)
		goto out;
	ctx->role = role->value;
@@ -1469,7 +1469,7 @@ static int string_to_context_struct(struct policydb *pol,
	oldc = *p;
	*p++ = 0;

	typdatum = hashtab_search(&pol->p_types.table, scontextp);
	typdatum = symtab_search(&pol->p_types, scontextp);
	if (!typdatum || typdatum->attribute)
		goto out;

@@ -2024,7 +2024,7 @@ static int convert_context(struct context *oldc, struct context *newc, void *p)

	/* Convert the user. */
	rc = -EINVAL;
	usrdatum = hashtab_search(&args->newp->p_users.table,
	usrdatum = symtab_search(&args->newp->p_users,
				 sym_name(args->oldp,
					  SYM_USERS, oldc->user - 1));
	if (!usrdatum)
@@ -2033,7 +2033,7 @@ static int convert_context(struct context *oldc, struct context *newc, void *p)

	/* Convert the role. */
	rc = -EINVAL;
	role = hashtab_search(&args->newp->p_roles.table,
	role = symtab_search(&args->newp->p_roles,
			     sym_name(args->oldp, SYM_ROLES, oldc->role - 1));
	if (!role)
		goto bad;
@@ -2041,7 +2041,7 @@ static int convert_context(struct context *oldc, struct context *newc, void *p)

	/* Convert the type. */
	rc = -EINVAL;
	typdatum = hashtab_search(&args->newp->p_types.table,
	typdatum = symtab_search(&args->newp->p_types,
				 sym_name(args->oldp,
					  SYM_TYPES, oldc->type - 1));
	if (!typdatum)
@@ -2623,7 +2623,7 @@ int security_get_user_sids(struct selinux_state *state,
		goto out_unlock;

	rc = -EINVAL;
	user = hashtab_search(&policydb->p_users.table, username);
	user = symtab_search(&policydb->p_users, username);
	if (!user)
		goto out_unlock;

@@ -2975,7 +2975,7 @@ static int security_preserve_bools(struct selinux_state *state,
	if (rc)
		goto out;
	for (i = 0; i < nbools; i++) {
		booldatum = hashtab_search(&policydb->p_bools.table, bnames[i]);
		booldatum = symtab_search(&policydb->p_bools, bnames[i]);
		if (booldatum)
			booldatum->state = bvalues[i];
	}
@@ -3226,7 +3226,7 @@ int security_get_permissions(struct selinux_state *state,
	read_lock(&state->ss->policy_rwlock);

	rc = -EINVAL;
	match = hashtab_search(&policydb->p_classes.table, class);
	match = symtab_search(&policydb->p_classes, class);
	if (!match) {
		pr_err("SELinux: %s:  unrecognized class %s\n",
			__func__, class);
@@ -3365,7 +3365,7 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
	case AUDIT_SUBJ_USER:
	case AUDIT_OBJ_USER:
		rc = -EINVAL;
		userdatum = hashtab_search(&policydb->p_users.table, rulestr);
		userdatum = symtab_search(&policydb->p_users, rulestr);
		if (!userdatum)
			goto out;
		tmprule->au_ctxt.user = userdatum->value;
@@ -3373,7 +3373,7 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
	case AUDIT_SUBJ_ROLE:
	case AUDIT_OBJ_ROLE:
		rc = -EINVAL;
		roledatum = hashtab_search(&policydb->p_roles.table, rulestr);
		roledatum = symtab_search(&policydb->p_roles, rulestr);
		if (!roledatum)
			goto out;
		tmprule->au_ctxt.role = roledatum->value;
@@ -3381,7 +3381,7 @@ int selinux_audit_rule_init(u32 field, u32 op, char *rulestr, void **vrule)
	case AUDIT_SUBJ_TYPE:
	case AUDIT_OBJ_TYPE:
		rc = -EINVAL;
		typedatum = hashtab_search(&policydb->p_types.table, rulestr);
		typedatum = symtab_search(&policydb->p_types, rulestr);
		if (!typedatum)
			goto out;
		tmprule->au_ctxt.type = typedatum->value;
Loading