diff --git a/tools/check_seapp.c b/tools/check_seapp.c index 6b52ce08e5e26a0f3a0ef9cb52f5778eb91a17b9..b3e4980df5f46815160f1d6354f5ec399bf7e410 100644 --- a/tools/check_seapp.c +++ b/tools/check_seapp.c @@ -8,6 +8,7 @@ #include <errno.h> #include <stdint.h> #include <search.h> +#include <stdbool.h> #include <sepol/sepol.h> #include <sepol/policydb/policydb.h> @@ -458,6 +459,46 @@ static void free_kvp(kvp *k) { free(k->value); } +/** + * Checks a rule_map for any variation of KVP's that shouldn't be allowed. + * Note that this function logs all errors. + * + * Current Checks: + * 1. That a specified name entry should have a specified seinfo entry as well. + * @param rm + * The rule map to check for validity. + * @return + * true if the rule is valid, false otherwise. + */ +static bool rule_map_validate(const rule_map *rm) { + + int i; + bool found_name = false; + bool found_seinfo = false; + char *name = NULL; + key_map *tmp; + + for(i=0; i < rm->length; i++) { + tmp = &(rm->m[i]); + + if(!strcmp(tmp->name, "name") && tmp->data) { + name = tmp->data; + found_name = true; + } + if(!strcmp(tmp->name, "seinfo") && tmp->data) { + found_seinfo = true; + } + } + + if(found_name && !found_seinfo) { + log_error("No seinfo specified with name=\"%s\", on line: %d\n", + name, rm->lineno); + return false; + } + + return true; +} + /** * Given a set of key value pairs, this will construct a new rule map. * On error this function calls exit. @@ -473,6 +514,7 @@ static void free_kvp(kvp *k) { static rule_map *rule_map_new(kvp keys[], unsigned int num_of_keys, int lineno) { unsigned int i = 0, j = 0; + bool valid_rule; rule_map *new_map = NULL; kvp *k = NULL; key_map *r = NULL, *x = NULL; @@ -546,6 +588,12 @@ static rule_map *rule_map_new(kvp keys[], unsigned int num_of_keys, int lineno) goto err; } + valid_rule = rule_map_validate(new_map); + if(!valid_rule) { + /* Error message logged from rule_map_validate() */ + goto err; + } + return new_map; oom: