aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorStephen Smalley <sds@tycho.nsa.gov>2015-02-13 14:58:31 -0500
committerStephen Smalley <sds@tycho.nsa.gov>2015-02-13 14:58:31 -0500
commit0b820042e4bb9bb93790e0cf0812fd97d15ce7a5 (patch)
tree12f7fb024c639f929d1d64c0ffefaf2d4967edad /tools
parent41d961a7281bff9e345dcefcf7a6ea95f6129714 (diff)
downloadandroid_external_sepolicy-0b820042e4bb9bb93790e0cf0812fd97d15ce7a5.tar.gz
android_external_sepolicy-0b820042e4bb9bb93790e0cf0812fd97d15ce7a5.tar.bz2
android_external_sepolicy-0b820042e4bb9bb93790e0cf0812fd97d15ce7a5.zip
checkseapp: Detect duplicate entries within seapp_contexts.
Presently it only detects complete duplicates if you specify -s (strict), which is not used in the external/sepolicy Makefile, and it allows overriding earlier entries that have the same input selectors (e.g. user=, seinfo=) with different values for the output selectors (e.g. domain=, type=). Thus, a device/<vendor>/<board>/sepolicy/seapp_contexts file can override the external/sepolicy definitions, and even a single seapp_contexts file can contain duplicated or conflicting definitions. Make it always check strictly, and prohibit either duplicates on the input selectors (i.e. overrides) or complete duplicates (redundant). Change-Id: Id1e38133cbe31b796253101cfe3b111d1826bc8c Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
Diffstat (limited to 'tools')
-rw-r--r--tools/check_seapp.c55
1 files changed, 12 insertions, 43 deletions
diff --git a/tools/check_seapp.c b/tools/check_seapp.c
index af780a3..90fa0a4 100644
--- a/tools/check_seapp.c
+++ b/tools/check_seapp.c
@@ -36,6 +36,12 @@ enum map_match {
map_matched
};
+const char *map_match_str[] = {
+ "do not match",
+ "match on all inputs",
+ "match on everything"
+};
+
/**
* Whether or not the "key" from a key vaue pair is considered an
* input or an output.
@@ -126,9 +132,6 @@ struct policy_info {
/** Set to !0 to enable verbose logging */
static int logging_verbose = 0;
-/** set to !0 to enable strict checking of duplicate entries */
-static int is_strict = 0;
-
/** file handle to the output file */
static FILE *output_file = NULL;
@@ -622,7 +625,6 @@ static void usage() {
"and allows later declarations to override previous ones on a match.\n"
"Options:\n"
"-h - print this help message\n"
- "-s - enable strict checking of duplicates. This causes the program to exit on a duplicate entry with a non-zero exit status\n"
"-v - enable verbose debugging informations\n"
"-p policy file - specify policy file for strict checking of output selectors against the policy\n"
"-o output file - specify output file, default is stdout\n");
@@ -722,9 +724,6 @@ static void handle_options(int argc, char *argv[]) {
case 'p':
pol.policy_file_name = optarg;
break;
- case 's':
- is_strict = 1;
- break;
case 'v':
log_set_verbose();
break;
@@ -822,7 +821,6 @@ static void rule_add(rule_map *rm) {
ENTRY *f;
hash_entry *entry;
hash_entry *tmp;
- char *preserved_key;
e.key = rm->key;
@@ -839,41 +837,12 @@ static void rule_add(rule_map *rm) {
log_info("Existing entry found!\n");
tmp = (hash_entry *)f->data;
cmp = rule_map_cmp(rm, tmp->r);
- log_info("Comparing on rule map ret: %d\n", cmp);
- /* Override be freeing the old rule map and updating
- the pointer */
- if(cmp != map_matched) {
-
- /*
- * DO NOT free key pointers given to the hash map, instead
- * free the new key. The ordering here is critical!
- */
- preserved_key = tmp->r->key;
- rule_map_free(tmp->r, rule_map_preserve_key);
-/* hdestroy() frees comparsion keys for non glibc */
-#ifdef __GLIBC__
- free(rm->key);
-#endif
- rm->key = preserved_key;
- tmp->r = rm;
- }
- /* Duplicate */
- else {
- /* if is_strict is set, then don't allow duplicates */
- if(is_strict) {
- log_error("Duplicate line detected in file: %s\n"
- "Lines %d and %d match!\n",
- out_file_name, tmp->r->lineno, rm->lineno);
- rule_map_free(rm, rule_map_destroy_key);
- goto err;
- }
-
- /* Allow duplicates, just drop the entry*/
- log_info("Duplicate line detected in file: %s\n"
- "Lines %d and %d match!\n",
- out_file_name, tmp->r->lineno, rm->lineno);
- rule_map_free(rm, rule_map_destroy_key);
- }
+ log_error("Duplicate line detected in file: %s\n"
+ "Lines %d and %d %s!\n",
+ out_file_name, tmp->r->lineno, rm->lineno,
+ map_match_str[cmp]);
+ rule_map_free(rm, rule_map_destroy_key);
+ goto err;
}
/* It wasn't found, just add the rule map to the table */
else {