Rebase on upstream commit 32611aea6543 See $ cd SELinuxProject/selinux $ git log --pretty=oneline libsepol-3.2..32611aea6543 -- libsepol
141 lines
5.5 KiB
Diff
141 lines
5.5 KiB
Diff
From e65cf030b784dbb1ff4415e0b63a3bdf0158ccf6 Mon Sep 17 00:00:00 2001
|
|
From: James Carter <jwcart2@gmail.com>
|
|
Date: Thu, 8 Apr 2021 13:32:23 -0400
|
|
Subject: [PATCH] libsepol/cil: Move check for the shadowing of macro
|
|
parameters
|
|
|
|
In cil_gen_node(), after the declaration is added to the symbol
|
|
table, if the parent is a macro, then a check is made to ensure
|
|
the declaration does not shadow any of the macro's parameters.
|
|
This check also needs to be done when copying the AST.
|
|
|
|
Move the check for the shadowing of macro parameters to its own
|
|
function, cil_verify_decl_does_not_shadow_macro_parameter(), and
|
|
refactor cil_gen_node() and __cil_copy_node_helper() to use the
|
|
new function.
|
|
|
|
Signed-off-by: James Carter <jwcart2@gmail.com>
|
|
---
|
|
libsepol/cil/src/cil_build_ast.c | 16 +++-------------
|
|
libsepol/cil/src/cil_copy_ast.c | 20 ++++----------------
|
|
libsepol/cil/src/cil_verify.c | 18 ++++++++++++++++++
|
|
libsepol/cil/src/cil_verify.h | 1 +
|
|
4 files changed, 26 insertions(+), 29 deletions(-)
|
|
|
|
diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
|
|
index ec81db554b22..a4a2baa0f53b 100644
|
|
--- a/libsepol/cil/src/cil_build_ast.c
|
|
+++ b/libsepol/cil/src/cil_build_ast.c
|
|
@@ -161,19 +161,9 @@ int cil_gen_node(struct cil_db *db, struct cil_tree_node *ast_node, struct cil_s
|
|
}
|
|
|
|
if (ast_node->parent->flavor == CIL_MACRO) {
|
|
- struct cil_list_item *item;
|
|
- struct cil_list *param_list = ((struct cil_macro*)ast_node->parent->data)->params;
|
|
- if (param_list != NULL) {
|
|
- cil_list_for_each(item, param_list) {
|
|
- struct cil_param *param = item->data;
|
|
- if (param->flavor == ast_node->flavor) {
|
|
- if (param->str == key) {
|
|
- cil_log(CIL_ERR, "%s %s shadows a macro parameter in macro declaration\n", cil_node_to_string(ast_node), key);
|
|
- rc = SEPOL_ERR;
|
|
- goto exit;
|
|
- }
|
|
- }
|
|
- }
|
|
+ rc = cil_verify_decl_does_not_shadow_macro_parameter(ast_node->parent->data, ast_node, key);
|
|
+ if (rc != SEPOL_OK) {
|
|
+ goto exit;
|
|
}
|
|
}
|
|
|
|
diff --git a/libsepol/cil/src/cil_copy_ast.c b/libsepol/cil/src/cil_copy_ast.c
|
|
index 12bc553c6594..954eab330340 100644
|
|
--- a/libsepol/cil/src/cil_copy_ast.c
|
|
+++ b/libsepol/cil/src/cil_copy_ast.c
|
|
@@ -40,6 +40,7 @@
|
|
#include "cil_copy_ast.h"
|
|
#include "cil_build_ast.h"
|
|
#include "cil_strpool.h"
|
|
+#include "cil_verify.h"
|
|
|
|
struct cil_args_copy {
|
|
struct cil_tree_node *dest;
|
|
@@ -1716,7 +1717,6 @@ int __cil_copy_node_helper(struct cil_tree_node *orig, __attribute__((unused)) u
|
|
struct cil_db *db = NULL;
|
|
struct cil_args_copy *args = NULL;
|
|
struct cil_tree_node *namespace = NULL;
|
|
- struct cil_param *param = NULL;
|
|
enum cil_sym_index sym_index = CIL_SYM_UNKNOWN;
|
|
symtab_t *symtab = NULL;
|
|
void *data = NULL;
|
|
@@ -2043,21 +2043,9 @@ int __cil_copy_node_helper(struct cil_tree_node *orig, __attribute__((unused)) u
|
|
}
|
|
|
|
if (namespace->flavor == CIL_MACRO) {
|
|
- struct cil_macro *macro = namespace->data;
|
|
- struct cil_list *param_list = macro->params;
|
|
- if (param_list != NULL) {
|
|
- struct cil_list_item *item;
|
|
- cil_list_for_each(item, param_list) {
|
|
- param = item->data;
|
|
- if (param->flavor == new->flavor) {
|
|
- if (param->str == ((struct cil_symtab_datum*)new->data)->name) {
|
|
- cil_tree_log(orig, CIL_ERR, "%s %s shadows a macro parameter", cil_node_to_string(new), ((struct cil_symtab_datum*)orig->data)->name);
|
|
- cil_tree_log(namespace, CIL_ERR, "Note: macro declaration");
|
|
- rc = SEPOL_ERR;
|
|
- goto exit;
|
|
- }
|
|
- }
|
|
- }
|
|
+ rc = cil_verify_decl_does_not_shadow_macro_parameter(namespace->data, orig, DATUM(orig->data)->name);
|
|
+ if (rc != SEPOL_OK) {
|
|
+ goto exit;
|
|
}
|
|
}
|
|
}
|
|
diff --git a/libsepol/cil/src/cil_verify.c b/libsepol/cil/src/cil_verify.c
|
|
index 8fd54360698d..5a37dd2f76bc 100644
|
|
--- a/libsepol/cil/src/cil_verify.c
|
|
+++ b/libsepol/cil/src/cil_verify.c
|
|
@@ -412,6 +412,24 @@ int cil_verify_conditional_blocks(struct cil_tree_node *current)
|
|
return SEPOL_OK;
|
|
}
|
|
|
|
+int cil_verify_decl_does_not_shadow_macro_parameter(struct cil_macro *macro, struct cil_tree_node *node, const char *name)
|
|
+{
|
|
+ struct cil_list_item *item;
|
|
+ struct cil_list *param_list = macro->params;
|
|
+ if (param_list != NULL) {
|
|
+ cil_list_for_each(item, param_list) {
|
|
+ struct cil_param *param = item->data;
|
|
+ if (param->flavor == node->flavor) {
|
|
+ if (param->str == name) {
|
|
+ cil_log(CIL_ERR, "%s %s shadows a macro parameter in macro declaration\n", cil_node_to_string(node), name);
|
|
+ return SEPOL_ERR;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ return SEPOL_OK;
|
|
+}
|
|
+
|
|
int cil_verify_no_self_reference(struct cil_symtab_datum *datum, struct cil_list *datum_list)
|
|
{
|
|
struct cil_list_item *i;
|
|
diff --git a/libsepol/cil/src/cil_verify.h b/libsepol/cil/src/cil_verify.h
|
|
index 1887ae3f13a1..c497018f8a95 100644
|
|
--- a/libsepol/cil/src/cil_verify.h
|
|
+++ b/libsepol/cil/src/cil_verify.h
|
|
@@ -62,6 +62,7 @@ int cil_verify_expr_syntax(struct cil_tree_node *current, enum cil_flavor op, en
|
|
int cil_verify_constraint_leaf_expr_syntax(enum cil_flavor l_flavor, enum cil_flavor r_flavor, enum cil_flavor op, enum cil_flavor expr_flavor);
|
|
int cil_verify_constraint_expr_syntax(struct cil_tree_node *current, enum cil_flavor op);
|
|
int cil_verify_conditional_blocks(struct cil_tree_node *current);
|
|
+int cil_verify_decl_does_not_shadow_macro_parameter(struct cil_macro *macro, struct cil_tree_node *node, const char *name);
|
|
int cil_verify_no_self_reference(struct cil_symtab_datum *datum, struct cil_list *datum_list);
|
|
int __cil_verify_ranges(struct cil_list *list);
|
|
int __cil_verify_ordered_node_helper(struct cil_tree_node *node, uint32_t *finished, void *extra_args);
|
|
--
|
|
2.32.0
|
|
|