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+
912typedef 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
1523static 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+
214229static 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+
234256static 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+
250279static 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
373381bad :
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