Blame SOURCES/0031-libsepol-cil-Use-AST-to-track-blocks-and-optionals-w.patch

71cd55
From 525f0312d51d3afd48f5e0cd8a58cced3532cfdf Mon Sep 17 00:00:00 2001
71cd55
From: James Carter <jwcart2@gmail.com>
71cd55
Date: Tue, 30 Mar 2021 13:39:15 -0400
71cd55
Subject: [PATCH] libsepol/cil: Use AST to track blocks and optionals when
71cd55
 resolving
71cd55
71cd55
When resolving the AST, block and optional stacks are used to
71cd55
determine if the current rule being resolved is in a block or
71cd55
an optional. There is no need to do this since the parent node
71cd55
pointers can be used when exiting a block or an optional to
71cd55
determine if resolution is still within a block or an optional.
71cd55
71cd55
When entering either a block or an optional, update the appropriate
71cd55
tree node pointer. When finished with the last child of a block or
71cd55
optional, set the appropriate pointer to NULL. If a parent of the
71cd55
same kind is found when the parent node pointers are followed back
71cd55
to the root node, then set the pointer to that tree node.
71cd55
71cd55
Signed-off-by: James Carter <jwcart2@gmail.com>
71cd55
---
71cd55
 libsepol/cil/src/cil_resolve_ast.c | 107 +++++++++--------------------
71cd55
 1 file changed, 32 insertions(+), 75 deletions(-)
71cd55
71cd55
diff --git a/libsepol/cil/src/cil_resolve_ast.c b/libsepol/cil/src/cil_resolve_ast.c
71cd55
index 63beed9230b9..a61462d0eb31 100644
71cd55
--- a/libsepol/cil/src/cil_resolve_ast.c
71cd55
+++ b/libsepol/cil/src/cil_resolve_ast.c
71cd55
@@ -52,10 +52,10 @@ struct cil_args_resolve {
71cd55
 	enum cil_pass pass;
71cd55
 	uint32_t *changed;
71cd55
 	struct cil_list *disabled_optionals;
71cd55
-	struct cil_tree_node *optstack;
71cd55
+	struct cil_tree_node *optional;
71cd55
 	struct cil_tree_node *boolif;
71cd55
 	struct cil_tree_node *macro;
71cd55
-	struct cil_tree_node *blockstack;
71cd55
+	struct cil_tree_node *block;
71cd55
 	struct cil_list *sidorder_lists;
71cd55
 	struct cil_list *classorder_lists;
71cd55
 	struct cil_list *unordered_classorder_lists;
71cd55
@@ -3777,16 +3777,16 @@ int __cil_resolve_ast_node_helper(struct cil_tree_node *node, uint32_t *finished
71cd55
 	int rc = SEPOL_ERR;
71cd55
 	struct cil_args_resolve *args = extra_args;
71cd55
 	enum cil_pass pass = args->pass;
71cd55
-	struct cil_tree_node *optstack = args->optstack;
71cd55
+	struct cil_tree_node *optional = args->optional;
71cd55
 	struct cil_tree_node *boolif = args->boolif;
71cd55
-	struct cil_tree_node *blockstack = args->blockstack;
71cd55
+	struct cil_tree_node *block = args->block;
71cd55
 	struct cil_tree_node *macro = args->macro;
71cd55
 
71cd55
 	if (node == NULL) {
71cd55
 		goto exit;
71cd55
 	}
71cd55
 
71cd55
-	if (optstack != NULL) {
71cd55
+	if (optional != NULL) {
71cd55
 		if (node->flavor == CIL_TUNABLE || node->flavor == CIL_MACRO) {
71cd55
 			/* tuanbles and macros are not allowed in optionals*/
71cd55
 			cil_tree_log(node, CIL_ERR, "%s statement is not allowed in optionals", cil_node_to_string(node));
71cd55
@@ -3795,7 +3795,7 @@ int __cil_resolve_ast_node_helper(struct cil_tree_node *node, uint32_t *finished
71cd55
 		}
71cd55
 	}
71cd55
 
71cd55
-	if (blockstack != NULL) {
71cd55
+	if (block != NULL) {
71cd55
 		if (node->flavor == CIL_CAT || node->flavor == CIL_SENS) {
71cd55
 			cil_tree_log(node, CIL_ERR, "%s statement is not allowed in blocks", cil_node_to_string(node));
71cd55
 			rc = SEPOL_ERR;
71cd55
@@ -3849,11 +3849,11 @@ int __cil_resolve_ast_node_helper(struct cil_tree_node *node, uint32_t *finished
71cd55
 	if (rc == SEPOL_ENOENT) {
71cd55
 		enum cil_log_level lvl = CIL_ERR;
71cd55
 
71cd55
-		if (optstack != NULL) {
71cd55
+		if (optional != NULL) {
71cd55
 			lvl = CIL_INFO;
71cd55
 
71cd55
-			struct cil_optional *opt = (struct cil_optional *)optstack->data;
71cd55
-			struct cil_tree_node *opt_node = opt->datum.nodes->head->data;
71cd55
+			struct cil_optional *opt = (struct cil_optional *)optional->data;
71cd55
+			struct cil_tree_node *opt_node = NODE(opt);;
71cd55
 			/* disable an optional if something failed to resolve */
71cd55
 			opt->enabled = CIL_FALSE;
71cd55
 			cil_tree_log(node, lvl, "Failed to resolve %s statement", cil_node_to_string(node));
71cd55
@@ -3876,39 +3876,18 @@ int __cil_resolve_ast_first_child_helper(struct cil_tree_node *current, void *ex
71cd55
 {
71cd55
 	int rc = SEPOL_ERR;
71cd55
 	struct cil_args_resolve *args = extra_args;
71cd55
-	struct cil_tree_node *optstack = NULL;
71cd55
 	struct cil_tree_node *parent = NULL;
71cd55
-	struct cil_tree_node *blockstack = NULL;
71cd55
-	struct cil_tree_node *new = NULL;
71cd55
 
71cd55
 	if (current == NULL || extra_args == NULL) {
71cd55
 		goto exit;
71cd55
 	}
71cd55
 
71cd55
-	optstack = args->optstack;
71cd55
 	parent = current->parent;
71cd55
-	blockstack = args->blockstack;
71cd55
 
71cd55
-	if (parent->flavor == CIL_OPTIONAL || parent->flavor == CIL_BLOCK) {
71cd55
-		/* push this node onto a stack */
71cd55
-		cil_tree_node_init(&new;;
71cd55
-
71cd55
-		new->data = parent->data;
71cd55
-		new->flavor = parent->flavor;
71cd55
-
71cd55
-		if (parent->flavor == CIL_OPTIONAL) {
71cd55
-			if (optstack != NULL) {
71cd55
-				optstack->parent = new;
71cd55
-				new->cl_head = optstack;
71cd55
-			}
71cd55
-			args->optstack = new;
71cd55
-		} else if (parent->flavor == CIL_BLOCK) {
71cd55
-			if (blockstack != NULL) {
71cd55
-				blockstack->parent = new;
71cd55
-				new->cl_head = blockstack;
71cd55
-			}
71cd55
-			args->blockstack = new;
71cd55
-		}
71cd55
+	if (parent->flavor == CIL_BLOCK) {
71cd55
+		args->block = parent;
71cd55
+	} else if (parent->flavor == CIL_OPTIONAL) {
71cd55
+		args->optional = parent;
71cd55
 	} else if (parent->flavor == CIL_BOOLEANIF) {
71cd55
 		args->boolif = parent;
71cd55
 	} else if (parent->flavor == CIL_MACRO) {
71cd55
@@ -3927,7 +3906,6 @@ int __cil_resolve_ast_last_child_helper(struct cil_tree_node *current, void *ext
71cd55
 	int rc = SEPOL_ERR;
71cd55
 	struct cil_args_resolve *args = extra_args;
71cd55
 	struct cil_tree_node *parent = NULL;
71cd55
-	struct cil_tree_node *blockstack = NULL;
71cd55
 
71cd55
 	if (current == NULL ||  extra_args == NULL) {
71cd55
 		goto exit;
71cd55
@@ -3938,30 +3916,31 @@ int __cil_resolve_ast_last_child_helper(struct cil_tree_node *current, void *ext
71cd55
 	if (parent->flavor == CIL_MACRO) {
71cd55
 		args->macro = NULL;
71cd55
 	} else if (parent->flavor == CIL_OPTIONAL) {
71cd55
-		struct cil_tree_node *optstack;
71cd55
-
71cd55
+		struct cil_tree_node *n = parent->parent;
71cd55
 		if (((struct cil_optional *)parent->data)->enabled == CIL_FALSE) {
71cd55
 			*(args->changed) = CIL_TRUE;
71cd55
 			cil_list_append(args->disabled_optionals, CIL_NODE, parent);
71cd55
 		}
71cd55
-
71cd55
-		/* pop off the stack */
71cd55
-		optstack = args->optstack;
71cd55
-		args->optstack = optstack->cl_head;
71cd55
-		if (optstack->cl_head) {
71cd55
-			optstack->cl_head->parent = NULL;
71cd55
+		args->optional = NULL;
71cd55
+		while (n && n->flavor != CIL_ROOT) {
71cd55
+			if (n->flavor == CIL_OPTIONAL) {
71cd55
+				args->optional = n;
71cd55
+				break;
71cd55
+			}
71cd55
+			n = n->parent;
71cd55
 		}
71cd55
-		free(optstack);
71cd55
 	} else if (parent->flavor == CIL_BOOLEANIF) {
71cd55
 		args->boolif = NULL;
71cd55
 	} else if (parent->flavor == CIL_BLOCK) {
71cd55
-		/* pop off the stack */
71cd55
-		blockstack = args->blockstack;
71cd55
-		args->blockstack = blockstack->cl_head;
71cd55
-		if (blockstack->cl_head) {
71cd55
-			blockstack->cl_head->parent = NULL;
71cd55
+		struct cil_tree_node *n = parent->parent;
71cd55
+		args->block = NULL;
71cd55
+		while (n && n->flavor != CIL_ROOT) {
71cd55
+			if (n->flavor == CIL_BLOCK) {
71cd55
+				args->block = n;
71cd55
+				break;
71cd55
+			}
71cd55
+			n = n->parent;
71cd55
 		}
71cd55
-		free(blockstack);
71cd55
 	}
71cd55
 
71cd55
 	return SEPOL_OK;
71cd55
@@ -3970,16 +3949,6 @@ exit:
71cd55
 	return rc;
71cd55
 }
71cd55
 
71cd55
-static void cil_destroy_tree_node_stack(struct cil_tree_node *curr)
71cd55
-{
71cd55
-	struct cil_tree_node *next;
71cd55
-	while (curr != NULL) {
71cd55
-		next = curr->cl_head;
71cd55
-		free(curr);
71cd55
-		curr = next;
71cd55
-	}
71cd55
-}
71cd55
-
71cd55
 int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current)
71cd55
 {
71cd55
 	int rc = SEPOL_ERR;
71cd55
@@ -3994,7 +3963,8 @@ int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current)
71cd55
 	extra_args.db = db;
71cd55
 	extra_args.pass = pass;
71cd55
 	extra_args.changed = &changed;
71cd55
-	extra_args.optstack = NULL;
71cd55
+	extra_args.block = NULL;
71cd55
+	extra_args.optional = NULL;
71cd55
 	extra_args.boolif= NULL;
71cd55
 	extra_args.macro = NULL;
71cd55
 	extra_args.sidorder_lists = NULL;
71cd55
@@ -4003,7 +3973,6 @@ int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current)
71cd55
 	extra_args.catorder_lists = NULL;
71cd55
 	extra_args.sensitivityorder_lists = NULL;
71cd55
 	extra_args.in_list = NULL;
71cd55
-	extra_args.blockstack = NULL;
71cd55
 
71cd55
 	cil_list_init(&extra_args.disabled_optionals, CIL_NODE);
71cd55
 	cil_list_init(&extra_args.sidorder_lists, CIL_LIST_ITEM);
71cd55
@@ -4107,17 +4076,7 @@ int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current)
71cd55
 			}
71cd55
 			cil_list_destroy(&extra_args.disabled_optionals, CIL_FALSE);
71cd55
 			cil_list_init(&extra_args.disabled_optionals, CIL_NODE);
71cd55
-		}
71cd55
-
71cd55
-		/* reset the arguments */
71cd55
-		changed = 0;
71cd55
-		while (extra_args.optstack != NULL) {
71cd55
-			cil_destroy_tree_node_stack(extra_args.optstack);
71cd55
-			extra_args.optstack = NULL;
71cd55
-		}
71cd55
-		while (extra_args.blockstack!= NULL) {
71cd55
-			cil_destroy_tree_node_stack(extra_args.blockstack);
71cd55
-			extra_args.blockstack = NULL;
71cd55
+			changed = 0;
71cd55
 		}
71cd55
 	}
71cd55
 
71cd55
@@ -4128,8 +4087,6 @@ int cil_resolve_ast(struct cil_db *db, struct cil_tree_node *current)
71cd55
 
71cd55
 	rc = SEPOL_OK;
71cd55
 exit:
71cd55
-	cil_destroy_tree_node_stack(extra_args.optstack);
71cd55
-	cil_destroy_tree_node_stack(extra_args.blockstack);
71cd55
 	__cil_ordered_lists_destroy(&extra_args.sidorder_lists);
71cd55
 	__cil_ordered_lists_destroy(&extra_args.classorder_lists);
71cd55
 	__cil_ordered_lists_destroy(&extra_args.catorder_lists);
71cd55
-- 
71cd55
2.32.0
71cd55