187
static u32 filenametr_hash(struct hashtab *h, const void *k)
189
const struct filename_trans *ft = k;
191
unsigned int byte_num;
194
hash = ft->stype ^ ft->ttype ^ ft->tclass;
197
while ((focus = ft->name[byte_num++]))
198
hash = partial_name_hash(focus, hash);
199
return hash & (h->size - 1);
202
static int filenametr_cmp(struct hashtab *h, const void *k1, const void *k2)
204
const struct filename_trans *ft1 = k1;
205
const struct filename_trans *ft2 = k2;
208
v = ft1->stype - ft2->stype;
212
v = ft1->ttype - ft2->ttype;
216
v = ft1->tclass - ft2->tclass;
220
return strcmp(ft1->name, ft2->name);
177
224
static u32 rangetr_hash(struct hashtab *h, const void *k)
179
226
const struct range_trans *key = k;
276
p->filename_trans = hashtab_create(filenametr_hash, filenametr_cmp, (1 << 10));
277
if (!p->filename_trans)
229
280
p->range_tr = hashtab_create(rangetr_hash, rangetr_cmp, 256);
230
281
if (!p->range_tr)
284
ebitmap_init(&p->filename_trans_ttypes);
233
285
ebitmap_init(&p->policycaps);
234
286
ebitmap_init(&p->permissive_map);
290
hashtab_destroy(p->filename_trans);
291
hashtab_destroy(p->range_tr);
238
292
for (i = 0; i < SYM_NUM; i++)
239
293
hashtab_destroy(p->symtab[i].table);
414
468
#ifdef DEBUG_HASHES
415
static void symtab_hash_eval(struct symtab *s)
419
for (i = 0; i < SYM_NUM; i++) {
420
struct hashtab *h = s[i].table;
421
struct hashtab_info info;
423
hashtab_stat(h, &info);
424
printk(KERN_DEBUG "SELinux: %s: %d entries and %d/%d buckets used, "
425
"longest chain length %d\n", symtab_name[i], h->nel,
426
info.slots_used, h->size, info.max_chain_len);
430
static void rangetr_hash_eval(struct hashtab *h)
469
static void hash_eval(struct hashtab *h, const char *hash_name)
432
471
struct hashtab_info info;
434
473
hashtab_stat(h, &info);
435
printk(KERN_DEBUG "SELinux: rangetr: %d entries and %d/%d buckets used, "
436
"longest chain length %d\n", h->nel,
474
printk(KERN_DEBUG "SELinux: %s: %d entries and %d/%d buckets used, "
475
"longest chain length %d\n", hash_name, h->nel,
437
476
info.slots_used, h->size, info.max_chain_len);
479
static void symtab_hash_eval(struct symtab *s)
483
for (i = 0; i < SYM_NUM; i++)
484
hash_eval(s[i].table, symtab_name[i]);
440
static inline void rangetr_hash_eval(struct hashtab *h)
488
static inline void hash_eval(struct hashtab *h, char *hash_name)
499
547
rc = flex_array_prealloc(p->type_val_to_struct_array, 0,
500
p->p_types.nprim - 1, GFP_KERNEL | __GFP_ZERO);
548
p->p_types.nprim, GFP_KERNEL | __GFP_ZERO);
721
static int filenametr_destroy(void *key, void *datum, void *p)
723
struct filename_trans *ft = key;
673
731
static int range_tr_destroy(void *key, void *datum, void *p)
675
733
struct mls_range *rt = datum;
828
hashtab_map(p->filename_trans, filenametr_destroy, NULL);
829
hashtab_destroy(p->filename_trans);
770
831
hashtab_map(p->range_tr, range_tr_destroy, NULL);
771
832
hashtab_destroy(p->range_tr);
1854
static int filename_trans_read(struct policydb *p, void *fp)
1856
struct filename_trans *ft;
1857
struct filename_trans_datum *otype;
1863
if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
1866
rc = next_entry(buf, fp, sizeof(u32));
1869
nel = le32_to_cpu(buf[0]);
1871
for (i = 0; i < nel; i++) {
1877
ft = kzalloc(sizeof(*ft), GFP_KERNEL);
1882
otype = kmalloc(sizeof(*otype), GFP_KERNEL);
1886
/* length of the path component string */
1887
rc = next_entry(buf, fp, sizeof(u32));
1890
len = le32_to_cpu(buf[0]);
1893
name = kmalloc(len + 1, GFP_KERNEL);
1899
/* path component string */
1900
rc = next_entry(name, fp, len);
1905
rc = next_entry(buf, fp, sizeof(u32) * 4);
1909
ft->stype = le32_to_cpu(buf[0]);
1910
ft->ttype = le32_to_cpu(buf[1]);
1911
ft->tclass = le32_to_cpu(buf[2]);
1913
otype->otype = le32_to_cpu(buf[3]);
1915
rc = ebitmap_set_bit(&p->filename_trans_ttypes, ft->ttype, 1);
1919
hashtab_insert(p->filename_trans, ft, otype);
1921
hash_eval(p->filename_trans, "filenametr");
1791
1931
static int genfs_read(struct policydb *p, void *fp)
2185
2325
p->symtab[i].nprim = nprim;
2329
p->process_class = string_to_security_class(p, "process");
2330
if (!p->process_class)
2188
2333
rc = avtab_read(&p->te_avtab, fp, p);
2217
2362
tr->role = le32_to_cpu(buf[0]);
2218
2363
tr->type = le32_to_cpu(buf[1]);
2219
2364
tr->new_role = le32_to_cpu(buf[2]);
2365
if (p->policyvers >= POLICYDB_VERSION_ROLETRANS) {
2366
rc = next_entry(buf, fp, sizeof(u32));
2369
tr->tclass = le32_to_cpu(buf[0]);
2371
tr->tclass = p->process_class;
2220
2373
if (!policydb_role_isvalid(p, tr->role) ||
2221
2374
!policydb_type_isvalid(p, tr->type) ||
2375
!policydb_class_isvalid(p, tr->tclass) ||
2222
2376
!policydb_role_isvalid(p, tr->new_role))
2408
rc = filename_trans_read(p, fp);
2254
2412
rc = policydb_index(p);
2259
p->process_class = string_to_security_class(p, "process");
2260
if (!p->process_class)
2264
2417
p->process_trans_perms = string_to_av_perm(p, p->process_class, "transition");
2265
2418
p->process_trans_perms |= string_to_av_perm(p, p->process_class, "dyntransition");
2266
2419
if (!p->process_trans_perms)
2288
2441
/* preallocate so we don't have to worry about the put ever failing */
2289
rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim - 1,
2442
rc = flex_array_prealloc(p->type_attr_map_array, 0, p->p_types.nprim,
2290
2443
GFP_KERNEL | __GFP_ZERO);
2453
2607
rc = put_entry(buf, sizeof(u32), 3, fp);
2610
if (p->policyvers >= POLICYDB_VERSION_ROLETRANS) {
2611
buf[0] = cpu_to_le32(tr->tclass);
2612
rc = put_entry(buf, sizeof(u32), 1, fp);
3009
3169
/* count the number of entries in the hashtab */
3011
rc = hashtab_map(p->range_tr, range_count, &nel);
3171
rc = hashtab_map(p->range_tr, hashtab_cnt, &nel);
3188
static int filename_write_helper(void *key, void *data, void *ptr)
3191
struct filename_trans *ft = key;
3192
struct filename_trans_datum *otype = data;
3197
len = strlen(ft->name);
3198
buf[0] = cpu_to_le32(len);
3199
rc = put_entry(buf, sizeof(u32), 1, fp);
3203
rc = put_entry(ft->name, sizeof(char), len, fp);
3209
buf[2] = ft->tclass;
3210
buf[3] = otype->otype;
3212
rc = put_entry(buf, sizeof(u32), 4, fp);
3219
static int filename_trans_write(struct policydb *p, void *fp)
3225
if (p->policyvers < POLICYDB_VERSION_FILENAME_TRANS)
3229
rc = hashtab_map(p->filename_trans, hashtab_cnt, &nel);
3233
buf[0] = cpu_to_le32(nel);
3234
rc = put_entry(buf, sizeof(u32), 1, fp);
3238
rc = hashtab_map(p->filename_trans, filename_write_helper, fp);
3029
3246
* Write the configuration data in a policy database
3030
3247
* structure to a policy database binary representation