selinux: do not allocate hashtabs dynamically
authorOndrej Mosnacek <omosnace@redhat.com>
Tue, 28 Apr 2020 12:55:12 +0000 (14:55 +0200)
committerPaul Moore <paul@paul-moore.com>
Fri, 1 May 2020 20:34:57 +0000 (16:34 -0400)
It is simpler to allocate them statically in the corresponding
structure, avoiding unnecessary kmalloc() calls and pointer
dereferencing.

Signed-off-by: Ondrej Mosnacek <omosnace@redhat.com>
[PM: manual merging required in policydb.c]
Signed-off-by: Paul Moore <paul@paul-moore.com>
security/selinux/ss/hashtab.c
security/selinux/ss/hashtab.h
security/selinux/ss/mls.c
security/selinux/ss/policydb.c
security/selinux/ss/policydb.h
security/selinux/ss/services.c
security/selinux/ss/symtab.c
security/selinux/ss/symtab.h

index 883f19d32c28458600332d1e02fb9907337c8d84..5ee868116d7067211cd264a13d1fa799e24c2494 100644 (file)
@@ -29,34 +29,21 @@ static u32 hashtab_compute_size(u32 nel)
        return nel == 0 ? 0 : roundup_pow_of_two(nel);
 }
 
-struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, const void *key),
-                              int (*keycmp)(struct hashtab *h, const void *key1, const void *key2),
-                              u32 nel_hint)
+int hashtab_init(struct hashtab *h,
+                u32 (*hash_value)(struct hashtab *h, const void *key),
+                int (*keycmp)(struct hashtab *h, const void *key1,
+                              const void *key2),
+                u32 nel_hint)
 {
-       struct hashtab *p;
-       u32 i, size = hashtab_compute_size(nel_hint);
-
-       p = kzalloc(sizeof(*p), GFP_KERNEL);
-       if (!p)
-               return p;
-
-       p->size = size;
-       p->nel = 0;
-       p->hash_value = hash_value;
-       p->keycmp = keycmp;
-       if (!size)
-               return p;
-
-       p->htable = kmalloc_array(size, sizeof(*p->htable), GFP_KERNEL);
-       if (!p->htable) {
-               kfree(p);
-               return NULL;
-       }
-
-       for (i = 0; i < size; i++)
-               p->htable[i] = NULL;
+       h->size = hashtab_compute_size(nel_hint);
+       h->nel = 0;
+       h->hash_value = hash_value;
+       h->keycmp = keycmp;
+       if (!h->size)
+               return 0;
 
-       return p;
+       h->htable = kcalloc(h->size, sizeof(*h->htable), GFP_KERNEL);
+       return h->htable ? 0 : -ENOMEM;
 }
 
 int hashtab_insert(struct hashtab *h, void *key, void *datum)
@@ -66,7 +53,7 @@ int hashtab_insert(struct hashtab *h, void *key, void *datum)
 
        cond_resched();
 
-       if (!h || !h->size || h->nel == HASHTAB_MAX_NODES)
+       if (!h->size || h->nel == HASHTAB_MAX_NODES)
                return -EINVAL;
 
        hvalue = h->hash_value(h, key);
@@ -102,7 +89,7 @@ void *hashtab_search(struct hashtab *h, const void *key)
        u32 hvalue;
        struct hashtab_node *cur;
 
-       if (!h || !h->size)
+       if (!h->size)
                return NULL;
 
        hvalue = h->hash_value(h, key);
@@ -121,9 +108,6 @@ void hashtab_destroy(struct hashtab *h)
        u32 i;
        struct hashtab_node *cur, *temp;
 
-       if (!h)
-               return;
-
        for (i = 0; i < h->size; i++) {
                cur = h->htable[i];
                while (cur) {
@@ -136,8 +120,6 @@ void hashtab_destroy(struct hashtab *h)
 
        kfree(h->htable);
        h->htable = NULL;
-
-       kfree(h);
 }
 
 int hashtab_map(struct hashtab *h,
@@ -148,9 +130,6 @@ int hashtab_map(struct hashtab *h,
        int ret;
        struct hashtab_node *cur;
 
-       if (!h)
-               return 0;
-
        for (i = 0; i < h->size; i++) {
                cur = h->htable[i];
                while (cur) {
index dde54d9ff01c7e9d4994368dd3b731e82d217f38..31c11511fe100b8078839582bf51dea7718e1a14 100644 (file)
@@ -35,14 +35,15 @@ struct hashtab_info {
 };
 
 /*
- * Creates a new hash table with the specified characteristics.
+ * Initializes a new hash table with the specified characteristics.
  *
- * Returns NULL if insufficent space is available or
- * the new hash table otherwise.
+ * Returns -ENOMEM if insufficient space is available or 0 otherwise.
  */
-struct hashtab *hashtab_create(u32 (*hash_value)(struct hashtab *h, const void *key),
-                              int (*keycmp)(struct hashtab *h, const void *key1, const void *key2),
-                              u32 nel_hint);
+int hashtab_init(struct hashtab *h,
+                u32 (*hash_value)(struct hashtab *h, const void *key),
+                int (*keycmp)(struct hashtab *h, const void *key1,
+                              const void *key2),
+                u32 nel_hint);
 
 /*
  * Inserts the specified (key, datum) pair into the specified hash table.
index 6a5d7d08933d3b2dca40e9009e223fae82f78afe..cd8734f25b39bf66b1b043bd721e9952db903ff7 100644 (file)
@@ -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 = hashtab_search(&p->p_levels.table,
                                  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 = hashtab_search(&pol->p_levels.table, 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 = hashtab_search(&pol->p_cats.table, 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 = hashtab_search(&pol->p_cats.table, rngptr);
                        if (!rngdatum)
                                return -EINVAL;
 
@@ -458,7 +458,7 @@ int mls_convert_context(struct policydb *oldp,
                return 0;
 
        for (l = 0; l < 2; l++) {
-               levdatum = hashtab_search(newp->p_levels.table,
+               levdatum = hashtab_search(&newp->p_levels.table,
                                          sym_name(oldp, SYM_LEVELS,
                                                   oldc->range.level[l].sens - 1));
 
@@ -470,7 +470,7 @@ int mls_convert_context(struct policydb *oldp,
                                              node, i) {
                        int rc;
 
-                       catdatum = hashtab_search(newp->p_cats.table,
+                       catdatum = hashtab_search(&newp->p_cats.table,
                                                  sym_name(oldp, SYM_CATS, i));
                        if (!catdatum)
                                return -EINVAL;
@@ -506,7 +506,7 @@ int mls_compute_sid(struct policydb *p,
                rtr.source_type = scontext->type;
                rtr.target_type = tcontext->type;
                rtr.target_class = tclass;
-               r = hashtab_search(p->range_tr, &rtr);
+               r = hashtab_search(&p->range_tr, &rtr);
                if (r)
                        return mls_range_set(newcontext, r);
 
index 76358c9de1295637a906b8408fc59768cebbbecd..a30cad18931b8ef94ba1b492a614d4bf6f8598ce 100644 (file)
@@ -195,8 +195,8 @@ static int common_destroy(void *key, void *datum, void *p)
        kfree(key);
        if (datum) {
                comdatum = datum;
-               hashtab_map(comdatum->permissions.table, perm_destroy, NULL);
-               hashtab_destroy(comdatum->permissions.table);
+               hashtab_map(&comdatum->permissions.table, perm_destroy, NULL);
+               hashtab_destroy(&comdatum->permissions.table);
        }
        kfree(datum);
        return 0;
@@ -224,8 +224,8 @@ static int cls_destroy(void *key, void *datum, void *p)
        kfree(key);
        if (datum) {
                cladatum = datum;
-               hashtab_map(cladatum->permissions.table, perm_destroy, NULL);
-               hashtab_destroy(cladatum->permissions.table);
+               hashtab_map(&cladatum->permissions.table, perm_destroy, NULL);
+               hashtab_destroy(&cladatum->permissions.table);
                constraint = cladatum->constraints;
                while (constraint) {
                        e = constraint->expr;
@@ -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 = hashtab_insert(&p->p_roles.table, key, role);
        if (rc)
                goto out;
 
@@ -668,7 +668,7 @@ static void symtab_hash_eval(struct symtab *s)
        int i;
 
        for (i = 0; i < SYM_NUM; i++)
-               hash_eval(s[i].table, symtab_name[i]);
+               hash_eval(&s[i].table, symtab_name[i]);
 }
 
 #else
@@ -739,7 +739,7 @@ static int policydb_index(struct policydb *p)
                if (!p->sym_val_to_name[i])
                        return -ENOMEM;
 
-               rc = hashtab_map(p->symtab[i].table, index_f[i], p);
+               rc = hashtab_map(&p->symtab[i].table, index_f[i], p);
                if (rc)
                        goto out;
        }
@@ -760,8 +760,8 @@ void policydb_destroy(struct policydb *p)
 
        for (i = 0; i < SYM_NUM; i++) {
                cond_resched();
-               hashtab_map(p->symtab[i].table, destroy_f[i], NULL);
-               hashtab_destroy(p->symtab[i].table);
+               hashtab_map(&p->symtab[i].table, destroy_f[i], NULL);
+               hashtab_destroy(&p->symtab[i].table);
        }
 
        for (i = 0; i < SYM_NUM; i++)
@@ -803,8 +803,8 @@ void policydb_destroy(struct policydb *p)
 
        cond_policydb_destroy(p);
 
-       hashtab_map(p->role_tr, role_tr_destroy, NULL);
-       hashtab_destroy(p->role_tr);
+       hashtab_map(&p->role_tr, role_tr_destroy, NULL);
+       hashtab_destroy(&p->role_tr);
 
        for (ra = p->role_allow; ra; ra = ra->next) {
                cond_resched();
@@ -813,11 +813,11 @@ void policydb_destroy(struct policydb *p)
        }
        kfree(lra);
 
-       hashtab_map(p->filename_trans, filenametr_destroy, NULL);
-       hashtab_destroy(p->filename_trans);
+       hashtab_map(&p->filename_trans, filenametr_destroy, NULL);
+       hashtab_destroy(&p->filename_trans);
 
-       hashtab_map(p->range_tr, range_tr_destroy, NULL);
-       hashtab_destroy(p->range_tr);
+       hashtab_map(&p->range_tr, range_tr_destroy, NULL);
+       hashtab_destroy(&p->range_tr);
 
        if (p->type_attr_map_array) {
                for (i = 0; i < p->p_types.nprim; i++)
@@ -1128,7 +1128,7 @@ 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.table, fp);
                if (rc)
                        goto bad;
        }
@@ -1300,7 +1300,8 @@ 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->comkey);
+               cladatum->comdatum = hashtab_search(&p->p_commons.table,
+                                                   cladatum->comkey);
                if (!cladatum->comdatum) {
                        pr_err("SELinux:  unknown common %s\n",
                               cladatum->comkey);
@@ -1308,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.table, fp);
                if (rc)
                        goto bad;
        }
@@ -1731,18 +1732,15 @@ static int policydb_bounds_sanity_check(struct policydb *p)
        if (p->policyvers < POLICYDB_VERSION_BOUNDARY)
                return 0;
 
-       rc = hashtab_map(p->p_users.table,
-                        user_bounds_sanity_check, p);
+       rc = hashtab_map(&p->p_users.table, user_bounds_sanity_check, p);
        if (rc)
                return rc;
 
-       rc = hashtab_map(p->p_roles.table,
-                        role_bounds_sanity_check, p);
+       rc = hashtab_map(&p->p_roles.table, role_bounds_sanity_check, p);
        if (rc)
                return rc;
 
-       rc = hashtab_map(p->p_types.table,
-                        type_bounds_sanity_check, p);
+       rc = hashtab_map(&p->p_types.table, type_bounds_sanity_check, p);
        if (rc)
                return rc;
 
@@ -1753,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 = hashtab_search(&p->p_classes.table, name);
        if (!cladatum)
                return 0;
 
@@ -1772,11 +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 = hashtab_search(&comdatum->permissions.table, name);
        if (!perdatum)
-               perdatum = hashtab_search(cladatum->permissions.table,
-                                         name);
+               perdatum = hashtab_search(&cladatum->permissions.table, name);
        if (!perdatum)
                return 0;
 
@@ -1800,9 +1796,9 @@ static int range_read(struct policydb *p, void *fp)
 
        nel = le32_to_cpu(buf[0]);
 
-       p->range_tr = hashtab_create(rangetr_hash, rangetr_cmp, nel);
-       if (!p->range_tr)
-               return -ENOMEM;
+       rc = hashtab_init(&p->range_tr, rangetr_hash, rangetr_cmp, nel);
+       if (rc)
+               return rc;
 
        for (i = 0; i < nel; i++) {
                rc = -ENOMEM;
@@ -1845,14 +1841,14 @@ static int range_read(struct policydb *p, void *fp)
                        goto out;
                }
 
-               rc = hashtab_insert(p->range_tr, rt, r);
+               rc = hashtab_insert(&p->range_tr, rt, r);
                if (rc)
                        goto out;
 
                rt = NULL;
                r = NULL;
        }
-       hash_eval(p->range_tr, "rangetr");
+       hash_eval(&p->range_tr, "rangetr");
        rc = 0;
 out:
        kfree(rt);
@@ -1892,7 +1888,7 @@ static int filename_trans_read_helper_compat(struct policydb *p, void *fp)
        otype = le32_to_cpu(buf[3]);
 
        last = NULL;
-       datum = hashtab_search(p->filename_trans, &key);
+       datum = hashtab_search(&p->filename_trans, &key);
        while (datum) {
                if (unlikely(ebitmap_get_bit(&datum->stypes, stype - 1))) {
                        /* conflicting/duplicate rules are ignored */
@@ -1922,7 +1918,7 @@ static int filename_trans_read_helper_compat(struct policydb *p, void *fp)
                        if (!ft)
                                goto out;
 
-                       rc = hashtab_insert(p->filename_trans, ft, datum);
+                       rc = hashtab_insert(&p->filename_trans, ft, datum);
                        if (rc)
                                goto out;
                        name = NULL;
@@ -2010,7 +2006,7 @@ static int filename_trans_read_helper(struct policydb *p, void *fp)
        ft->tclass = tclass;
        ft->name = name;
 
-       rc = hashtab_insert(p->filename_trans, ft, first);
+       rc = hashtab_insert(&p->filename_trans, ft, first);
        if (rc == -EEXIST)
                pr_err("SELinux:  Duplicate filename transition key\n");
        if (rc)
@@ -2047,10 +2043,11 @@ static int filename_trans_read(struct policydb *p, void *fp)
 
        if (p->policyvers < POLICYDB_VERSION_COMP_FTRANS) {
                p->compat_filename_trans_count = nel;
-               p->filename_trans = hashtab_create(filenametr_hash,
-                                                  filenametr_cmp, (1 << 11));
-               if (!p->filename_trans)
-                       return -ENOMEM;
+
+               rc = hashtab_init(&p->filename_trans, filenametr_hash,
+                                 filenametr_cmp, (1 << 11));
+               if (rc)
+                       return rc;
 
                for (i = 0; i < nel; i++) {
                        rc = filename_trans_read_helper_compat(p, fp);
@@ -2058,10 +2055,10 @@ static int filename_trans_read(struct policydb *p, void *fp)
                                return rc;
                }
        } else {
-               p->filename_trans = hashtab_create(filenametr_hash,
-                                                  filenametr_cmp, nel);
-               if (!p->filename_trans)
-                       return -ENOMEM;
+               rc = hashtab_init(&p->filename_trans, filenametr_hash,
+                                 filenametr_cmp, nel);
+               if (rc)
+                       return rc;
 
                for (i = 0; i < nel; i++) {
                        rc = filename_trans_read_helper(p, fp);
@@ -2069,7 +2066,7 @@ static int filename_trans_read(struct policydb *p, void *fp)
                                return rc;
                }
        }
-       hash_eval(p->filename_trans, "filenametr");
+       hash_eval(&p->filename_trans, "filenametr");
        return 0;
 }
 
@@ -2512,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].table, fp);
                        if (rc)
                                goto bad;
                }
@@ -2540,9 +2537,8 @@ int policydb_read(struct policydb *p, void *fp)
                goto bad;
        nel = le32_to_cpu(buf[0]);
 
-       rc = -ENOMEM;
-       p->role_tr = hashtab_create(role_trans_hash, role_trans_cmp, nel);
-       if (!p->role_tr)
+       rc = hashtab_init(&p->role_tr, role_trans_hash, role_trans_cmp, nel);
+       if (rc)
                goto bad;
        for (i = 0; i < nel; i++) {
                rc = -ENOMEM;
@@ -2578,7 +2574,7 @@ int policydb_read(struct policydb *p, void *fp)
                    !policydb_role_isvalid(p, rtd->new_role))
                        goto bad;
 
-               rc = hashtab_insert(p->role_tr, rtk, rtd);
+               rc = hashtab_insert(&p->role_tr, rtk, rtd);
                if (rc)
                        goto bad;
 
@@ -2822,12 +2818,12 @@ static int role_trans_write(struct policydb *p, void *fp)
        __le32 buf[1];
        int rc;
 
-       buf[0] = cpu_to_le32(p->role_tr->nel);
+       buf[0] = cpu_to_le32(p->role_tr.nel);
        rc = put_entry(buf, sizeof(u32), 1, fp);
        if (rc)
                return rc;
 
-       return hashtab_map(p->role_tr, role_trans_write_one, &pd);
+       return hashtab_map(&p->role_tr, role_trans_write_one, &pd);
 }
 
 static int role_allow_write(struct role_allow *r, void *fp)
@@ -2921,7 +2917,7 @@ static int common_write(void *vkey, void *datum, void *ptr)
        buf[0] = cpu_to_le32(len);
        buf[1] = cpu_to_le32(comdatum->value);
        buf[2] = cpu_to_le32(comdatum->permissions.nprim);
-       buf[3] = cpu_to_le32(comdatum->permissions.table->nel);
+       buf[3] = cpu_to_le32(comdatum->permissions.table.nel);
        rc = put_entry(buf, sizeof(u32), 4, fp);
        if (rc)
                return rc;
@@ -2930,7 +2926,7 @@ static int common_write(void *vkey, void *datum, void *ptr)
        if (rc)
                return rc;
 
-       rc = hashtab_map(comdatum->permissions.table, perm_write, fp);
+       rc = hashtab_map(&comdatum->permissions.table, perm_write, fp);
        if (rc)
                return rc;
 
@@ -3029,10 +3025,7 @@ static int class_write(void *vkey, void *datum, void *ptr)
        buf[1] = cpu_to_le32(len2);
        buf[2] = cpu_to_le32(cladatum->value);
        buf[3] = cpu_to_le32(cladatum->permissions.nprim);
-       if (cladatum->permissions.table)
-               buf[4] = cpu_to_le32(cladatum->permissions.table->nel);
-       else
-               buf[4] = 0;
+       buf[4] = cpu_to_le32(cladatum->permissions.table.nel);
        buf[5] = cpu_to_le32(ncons);
        rc = put_entry(buf, sizeof(u32), 6, fp);
        if (rc)
@@ -3048,7 +3041,7 @@ static int class_write(void *vkey, void *datum, void *ptr)
                        return rc;
        }
 
-       rc = hashtab_map(cladatum->permissions.table, perm_write, fp);
+       rc = hashtab_map(&cladatum->permissions.table, perm_write, fp);
        if (rc)
                return rc;
 
@@ -3443,13 +3436,13 @@ static int range_write(struct policydb *p, void *fp)
        pd.p = p;
        pd.fp = fp;
 
-       buf[0] = cpu_to_le32(p->range_tr->nel);
+       buf[0] = cpu_to_le32(p->range_tr.nel);
        rc = put_entry(buf, sizeof(u32), 1, fp);
        if (rc)
                return rc;
 
        /* actually write all of the entries */
-       rc = hashtab_map(p->range_tr, range_write_helper, &pd);
+       rc = hashtab_map(&p->range_tr, range_write_helper, &pd);
        if (rc)
                return rc;
 
@@ -3556,15 +3549,15 @@ static int filename_trans_write(struct policydb *p, void *fp)
                if (rc)
                        return rc;
 
-               rc = hashtab_map(p->filename_trans,
+               rc = hashtab_map(&p->filename_trans,
                                 filename_write_helper_compat, fp);
        } else {
-               buf[0] = cpu_to_le32(p->filename_trans->nel);
+               buf[0] = cpu_to_le32(p->filename_trans.nel);
                rc = put_entry(buf, sizeof(u32), 1, fp);
                if (rc)
                        return rc;
 
-               rc = hashtab_map(p->filename_trans, filename_write_helper, fp);
+               rc = hashtab_map(&p->filename_trans, filename_write_helper, fp);
        }
        return rc;
 }
@@ -3653,12 +3646,12 @@ int policydb_write(struct policydb *p, void *fp)
                pd.p = p;
 
                buf[0] = cpu_to_le32(p->symtab[i].nprim);
-               buf[1] = cpu_to_le32(p->symtab[i].table->nel);
+               buf[1] = cpu_to_le32(p->symtab[i].table.nel);
 
                rc = put_entry(buf, sizeof(u32), 2, fp);
                if (rc)
                        return rc;
-               rc = hashtab_map(p->symtab[i].table, write_f[i], &pd);
+               rc = hashtab_map(&p->symtab[i].table, write_f[i], &pd);
                if (rc)
                        return rc;
        }
index 35dc6aa7904d56f66efc24ec836da9f59c562d17..9591c9587cb699b20326cbe274d7367ed9b80ac7 100644 (file)
@@ -263,13 +263,13 @@ struct policydb {
        struct avtab te_avtab;
 
        /* role transitions */
-       struct hashtab *role_tr;
+       struct hashtab role_tr;
 
        /* file transitions with the last path component */
        /* quickly exclude lookups when parent ttype has no rules */
        struct ebitmap filename_trans_ttypes;
        /* actual set of filename_trans rules */
-       struct hashtab *filename_trans;
+       struct hashtab filename_trans;
        /* only used if policyvers < POLICYDB_VERSION_COMP_FTRANS */
        u32 compat_filename_trans_count;
 
@@ -294,7 +294,7 @@ struct policydb {
        struct genfs *genfs;
 
        /* range transitions table (range_trans_key -> mls_range) */
-       struct hashtab *range_tr;
+       struct hashtab range_tr;
 
        /* type -> attribute reverse mapping */
        struct ebitmap *type_attr_map_array;
index b49a336b1e6e3c5a68d0a0501dcb299c62460699..313919bd42f8cde415bc2fdf6ec5f669e1d77a60 100644 (file)
@@ -482,11 +482,11 @@ static void security_dump_masked_av(struct policydb *policydb,
 
        /* init permission_names */
        if (common_dat &&
-           hashtab_map(common_dat->permissions.table,
+           hashtab_map(&common_dat->permissions.table,
                        dump_masked_av_helper, permission_names) < 0)
                goto out;
 
-       if (hashtab_map(tclass_dat->permissions.table,
+       if (hashtab_map(&tclass_dat->permissions.table,
                        dump_masked_av_helper, permission_names) < 0)
                goto out;
 
@@ -1441,7 +1441,7 @@ static int string_to_context_struct(struct policydb *pol,
 
        *p++ = 0;
 
-       usrdatum = hashtab_search(pol->p_users.table, scontextp);
+       usrdatum = hashtab_search(&pol->p_users.table, 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 = hashtab_search(&pol->p_roles.table, 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 = hashtab_search(&pol->p_types.table, scontextp);
        if (!typdatum || typdatum->attribute)
                goto out;
 
@@ -1671,7 +1671,7 @@ static void filename_compute_type(struct policydb *policydb,
        ft.tclass = tclass;
        ft.name = objname;
 
-       datum = hashtab_search(policydb->filename_trans, &ft);
+       datum = hashtab_search(&policydb->filename_trans, &ft);
        while (datum) {
                if (ebitmap_get_bit(&datum->stypes, stype - 1)) {
                        newcontext->type = datum->otype;
@@ -1834,7 +1834,7 @@ static int security_compute_sid(struct selinux_state *state,
                        .tclass = tclass,
                };
 
-               rtd = hashtab_search(policydb->role_tr, &rtk);
+               rtd = hashtab_search(&policydb->role_tr, &rtk);
                if (rtd)
                        newcontext.role = rtd->new_role;
        }
@@ -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 = hashtab_search(&args->newp->p_users.table,
                                  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 = hashtab_search(&args->newp->p_roles.table,
                              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 = hashtab_search(&args->newp->p_types.table,
                                  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 = hashtab_search(&policydb->p_users.table, 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 = hashtab_search(&policydb->p_bools.table, bnames[i]);
                if (booldatum)
                        booldatum->state = bvalues[i];
        }
@@ -3189,8 +3189,8 @@ int security_get_classes(struct selinux_state *state,
        if (!*classes)
                goto out;
 
-       rc = hashtab_map(policydb->p_classes.table, get_classes_callback,
-                       *classes);
+       rc = hashtab_map(&policydb->p_classes.table, get_classes_callback,
+                        *classes);
        if (rc) {
                int i;
                for (i = 0; i < *nclasses; 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 = hashtab_search(&policydb->p_classes.table, class);
        if (!match) {
                pr_err("SELinux: %s:  unrecognized class %s\n",
                        __func__, class);
@@ -3240,14 +3240,14 @@ int security_get_permissions(struct selinux_state *state,
                goto out;
 
        if (match->comdatum) {
-               rc = hashtab_map(match->comdatum->permissions.table,
-                               get_permissions_callback, *perms);
+               rc = hashtab_map(&match->comdatum->permissions.table,
+                                get_permissions_callback, *perms);
                if (rc)
                        goto err;
        }
 
-       rc = hashtab_map(match->permissions.table, get_permissions_callback,
-                       *perms);
+       rc = hashtab_map(&match->permissions.table, get_permissions_callback,
+                        *perms);
        if (rc)
                goto err;
 
@@ -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 = hashtab_search(&policydb->p_users.table, 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 = hashtab_search(&policydb->p_roles.table, 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 = hashtab_search(&policydb->p_types.table, rulestr);
                if (!typedatum)
                        goto out;
                tmprule->au_ctxt.type = typedatum->value;
index dc2ce94165d36a4dd164b4ddacc916f63453236a..92d7a948070eda187f81ffc9a60a37d93083825d 100644 (file)
@@ -35,10 +35,7 @@ static int symcmp(struct hashtab *h, const void *key1, const void *key2)
 
 int symtab_init(struct symtab *s, unsigned int size)
 {
-       s->table = hashtab_create(symhash, symcmp, size);
-       if (!s->table)
-               return -ENOMEM;
        s->nprim = 0;
-       return 0;
+       return hashtab_init(&s->table, symhash, symcmp, size);
 }
 
index d75fcafe7281f1ab51f7337068c1b1f87c6880ef..f145301b9d9f73dbd3165644555c0ae43b34c308 100644 (file)
@@ -13,7 +13,7 @@
 #include "hashtab.h"
 
 struct symtab {
-       struct hashtab *table;  /* hash table (keyed on a string) */
+       struct hashtab table;   /* hash table (keyed on a string) */
        u32 nprim;              /* number of primary names in table */
 };