Skip to content

Commit e8b2f5b

Browse files
cgzonesjwcart2
authored andcommitted
libsepol: split validation of datum array gaps and entries
Split the validation of array datums regarding their gaps and entries to simplify further checking of common classes, booleans, levels and categories. Signed-off-by: Christian Göttsche <[email protected]>
1 parent 473bbbb commit e8b2f5b

File tree

1 file changed

+73
-39
lines changed

1 file changed

+73
-39
lines changed

libsepol/src/policydb_validate.c

Lines changed: 73 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@
66
#include "debug.h"
77
#include "policydb_validate.h"
88

9+
#define bool_xor(a, b) (!(a) != !(b))
10+
#define bool_xnor(a, b) !bool_xor(a, b)
11+
912
typedef struct validate {
1013
uint32_t nprim;
1114
ebitmap_t gaps;
1215
} validate_t;
1316

17+
typedef struct map_arg {
18+
validate_t *flavors;
19+
sepol_handle_t *handle;
20+
int mls;
21+
} map_arg_t;
1422

1523
static int create_gap_ebitmap(char **val_to_name, uint32_t nprim, ebitmap_t *gaps)
1624
{
@@ -211,6 +219,13 @@ static int validate_class_datum(sepol_handle_t *handle, class_datum_t *class, va
211219
return -1;
212220
}
213221

222+
static int validate_class_datum_wrapper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
223+
{
224+
map_arg_t *margs = args;
225+
226+
return validate_class_datum(margs->handle, d, margs->flavors);
227+
}
228+
214229
static int validate_role_datum(sepol_handle_t *handle, role_datum_t *role, validate_t flavors[])
215230
{
216231
if (validate_value(role->s.value, &flavors[SYM_ROLES]))
@@ -231,6 +246,13 @@ static int validate_role_datum(sepol_handle_t *handle, role_datum_t *role, valid
231246
return -1;
232247
}
233248

249+
static int validate_role_datum_wrapper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
250+
{
251+
map_arg_t *margs = args;
252+
253+
return validate_role_datum(margs->handle, d, margs->flavors);
254+
}
255+
234256
static int validate_type_datum(sepol_handle_t *handle, type_datum_t *type, validate_t flavors[])
235257
{
236258
if (validate_value(type->s.value, &flavors[SYM_TYPES]))
@@ -247,6 +269,13 @@ static int validate_type_datum(sepol_handle_t *handle, type_datum_t *type, valid
247269
return -1;
248270
}
249271

272+
static int validate_type_datum_wrapper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
273+
{
274+
map_arg_t *margs = args;
275+
276+
return validate_type_datum(margs->handle, d, margs->flavors);
277+
}
278+
250279
static int validate_mls_semantic_cat(mls_semantic_cat_t *cat, validate_t *cats)
251280
{
252281
for (; cat; cat = cat->next) {
@@ -310,32 +339,25 @@ static int validate_user_datum(sepol_handle_t *handle, user_datum_t *user, valid
310339
return -1;
311340
}
312341

313-
static int validate_datum_arrays(sepol_handle_t *handle, policydb_t *p, validate_t flavors[])
342+
static int validate_user_datum_wrapper(__attribute__((unused)) hashtab_key_t k, hashtab_datum_t d, void *args)
343+
{
344+
map_arg_t *margs = args;
345+
346+
return validate_user_datum(margs->handle, d, margs->flavors);
347+
}
348+
349+
static int validate_datum_array_gaps(sepol_handle_t *handle, policydb_t *p, validate_t flavors[])
314350
{
315351
unsigned int i;
316352

317353
for (i = 0; i < p->p_classes.nprim; i++) {
318-
if (p->class_val_to_struct[i]) {
319-
if (ebitmap_get_bit(&flavors[SYM_CLASSES].gaps, i))
320-
goto bad;
321-
if (validate_class_datum(handle, p->class_val_to_struct[i], flavors))
322-
goto bad;
323-
} else {
324-
if (!ebitmap_get_bit(&flavors[SYM_CLASSES].gaps, i))
325-
goto bad;
326-
}
354+
if (bool_xnor(p->class_val_to_struct[i], ebitmap_get_bit(&flavors[SYM_CLASSES].gaps, i)))
355+
goto bad;
327356
}
328357

329358
for (i = 0; i < p->p_roles.nprim; i++) {
330-
if (p->role_val_to_struct[i]) {
331-
if (ebitmap_get_bit(&flavors[SYM_ROLES].gaps, i))
332-
goto bad;
333-
if (validate_role_datum(handle, p->role_val_to_struct[i], flavors))
334-
goto bad;
335-
} else {
336-
if (!ebitmap_get_bit(&flavors[SYM_ROLES].gaps, i))
337-
goto bad;
338-
}
359+
if (bool_xnor(p->role_val_to_struct[i], ebitmap_get_bit(&flavors[SYM_ROLES].gaps, i)))
360+
goto bad;
339361
}
340362

341363
/*
@@ -344,34 +366,43 @@ static int validate_datum_arrays(sepol_handle_t *handle, policydb_t *p, validate
344366
*/
345367
if (p->policyvers < POLICYDB_VERSION_AVTAB || p->policyvers > POLICYDB_VERSION_PERMISSIVE) {
346368
for (i = 0; i < p->p_types.nprim; i++) {
347-
if (p->type_val_to_struct[i]) {
348-
if (ebitmap_get_bit(&flavors[SYM_TYPES].gaps, i))
349-
goto bad;
350-
if (validate_type_datum(handle, p->type_val_to_struct[i], flavors))
351-
goto bad;
352-
} else {
353-
if (!ebitmap_get_bit(&flavors[SYM_TYPES].gaps, i))
354-
goto bad;
355-
}
369+
if (bool_xnor(p->type_val_to_struct[i], ebitmap_get_bit(&flavors[SYM_TYPES].gaps, i)))
370+
goto bad;
356371
}
357372
}
358373

359374
for (i = 0; i < p->p_users.nprim; i++) {
360-
if (p->user_val_to_struct[i]) {
361-
if (ebitmap_get_bit(&flavors[SYM_USERS].gaps, i))
362-
goto bad;
363-
if (validate_user_datum(handle, p->user_val_to_struct[i], flavors))
364-
goto bad;
365-
} else {
366-
if (!ebitmap_get_bit(&flavors[SYM_USERS].gaps, i))
367-
goto bad;
368-
}
375+
if (bool_xnor(p->user_val_to_struct[i], ebitmap_get_bit(&flavors[SYM_USERS].gaps, i)))
376+
goto bad;
369377
}
370378

371379
return 0;
372380

373381
bad:
374-
ERR(handle, "Invalid datum arrays");
382+
ERR(handle, "Invalid datum array gaps");
383+
return -1;
384+
}
385+
386+
static int validate_datum_array_entries(sepol_handle_t *handle, policydb_t *p, validate_t flavors[])
387+
{
388+
map_arg_t margs = { flavors, handle, p->mls };
389+
390+
if (hashtab_map(p->p_classes.table, validate_class_datum_wrapper, &margs))
391+
goto bad;
392+
393+
if (hashtab_map(p->p_roles.table, validate_role_datum_wrapper, &margs))
394+
goto bad;
395+
396+
if (hashtab_map(p->p_types.table, validate_type_datum_wrapper, &margs))
397+
goto bad;
398+
399+
if (hashtab_map(p->p_users.table, validate_user_datum_wrapper, &margs))
400+
goto bad;
401+
402+
return 0;
403+
404+
bad:
405+
ERR(handle, "Invalid datum array entries");
375406
return -1;
376407
}
377408

@@ -762,7 +793,10 @@ int validate_policydb(sepol_handle_t *handle, policydb_t *p)
762793
if (validate_scopes(handle, p->scope, p->global))
763794
goto bad;
764795

765-
if (validate_datum_arrays(handle, p, flavors))
796+
if (validate_datum_array_gaps(handle, p, flavors))
797+
goto bad;
798+
799+
if (validate_datum_array_entries(handle, p, flavors))
766800
goto bad;
767801

768802
validate_array_destroy(flavors);

0 commit comments

Comments
 (0)