Re: [PATCH 6/8] libsepol/cil: Add line mark kind and line number to src info

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Aug 10, 2021 at 8:22 PM James Carter <jwcart2@xxxxxxxxx> wrote:
>
> To be able to write line mark information when writing the AST,
> the line mark kind and line number is needed in the src info.
>
> Instead of indicating whether the src info is for CIL or a hll,
> differentiate between CIL, a normal hll line mark, and an expanded
> hll line mark. Also include the line mark line number in the src
> info nodes.
>
> Signed-off-by: James Carter <jwcart2@xxxxxxxxx>
> ---
>  libsepol/cil/src/cil.c           | 13 +++++++++----
>  libsepol/cil/src/cil_build_ast.c | 17 +++++++++++++++--
>  libsepol/cil/src/cil_copy_ast.c  |  3 ++-
>  libsepol/cil/src/cil_internal.h  |  7 +++++--
>  libsepol/cil/src/cil_parser.c    | 27 +++++++++++----------------
>  libsepol/cil/src/cil_tree.c      |  2 +-
>  6 files changed, 43 insertions(+), 26 deletions(-)
>
> diff --git a/libsepol/cil/src/cil.c b/libsepol/cil/src/cil.c
> index bdd16eb8..caec5dad 100644
> --- a/libsepol/cil/src/cil.c
> +++ b/libsepol/cil/src/cil.c
> @@ -220,7 +220,9 @@ char *CIL_KEY_IOCTL;
>  char *CIL_KEY_UNORDERED;
>  char *CIL_KEY_SRC_INFO;
>  char *CIL_KEY_SRC_CIL;
> -char *CIL_KEY_SRC_HLL;
> +char *CIL_KEY_SRC_HLL_LMS;
> +char *CIL_KEY_SRC_HLL_LMX;
> +char *CIL_KEY_SRC_HLL_LME;
>
>  static void cil_init_keys(void)
>  {
> @@ -384,8 +386,10 @@ static void cil_init_keys(void)
>         CIL_KEY_IOCTL = cil_strpool_add("ioctl");
>         CIL_KEY_UNORDERED = cil_strpool_add("unordered");
>         CIL_KEY_SRC_INFO = cil_strpool_add("<src_info>");
> -       CIL_KEY_SRC_CIL = cil_strpool_add("<src_cil>");
> -       CIL_KEY_SRC_HLL = cil_strpool_add("<src_hll>");
> +       CIL_KEY_SRC_CIL = cil_strpool_add("cil");
> +       CIL_KEY_SRC_HLL_LMS = cil_strpool_add("lms");
> +       CIL_KEY_SRC_HLL_LMX = cil_strpool_add("lmx");
> +       CIL_KEY_SRC_HLL_LME = cil_strpool_add("lme");
>  }
>
>  void cil_db_init(struct cil_db **db)
> @@ -2881,6 +2885,7 @@ void cil_mls_init(struct cil_mls **mls)
>  void cil_src_info_init(struct cil_src_info **info)
>  {
>         *info = cil_malloc(sizeof(**info));
> -       (*info)->is_cil = 0;
> +       (*info)->kind = NULL;
> +       (*info)->hll_line = 0;
>         (*info)->path = NULL;
>  }
> diff --git a/libsepol/cil/src/cil_build_ast.c b/libsepol/cil/src/cil_build_ast.c
> index ffbd3082..a0f58b1e 100644
> --- a/libsepol/cil/src/cil_build_ast.c
> +++ b/libsepol/cil/src/cil_build_ast.c
> @@ -6060,6 +6060,7 @@ int cil_gen_src_info(struct cil_tree_node *parse_current, struct cil_tree_node *
>                 CIL_SYN_STRING,
>                 CIL_SYN_STRING,
>                 CIL_SYN_STRING,
> +               CIL_SYN_STRING,
>                 CIL_SYN_N_LISTS | CIL_SYN_END,
>                 CIL_SYN_END
>         };
> @@ -6077,8 +6078,19 @@ int cil_gen_src_info(struct cil_tree_node *parse_current, struct cil_tree_node *
>
>         cil_src_info_init(&info);
>
> -       info->is_cil = (parse_current->next->data == CIL_KEY_SRC_CIL) ? CIL_TRUE : CIL_FALSE;
> -       info->path = parse_current->next->next->data;
> +       info->kind = parse_current->next->data;
> +       if (info->kind != CIL_KEY_SRC_CIL && info->kind != CIL_KEY_SRC_HLL_LMS && info->kind != CIL_KEY_SRC_HLL_LMX) {
> +               cil_log(CIL_ERR, "Invalid src info kind\n");
> +               rc = SEPOL_ERR;
> +               goto exit;
> +       }
> +
> +       rc = cil_string_to_uint32(parse_current->next->next->data, &info->hll_line, 10);
> +       if (rc != SEPOL_OK) {
> +               goto exit;
> +       }
> +
> +       info->path = parse_current->next->next->next->data;
>
>         ast_node->data = info;
>         ast_node->flavor = CIL_SRC_INFO;
> @@ -6087,6 +6099,7 @@ int cil_gen_src_info(struct cil_tree_node *parse_current, struct cil_tree_node *
>
>  exit:
>         cil_tree_log(parse_current, CIL_ERR, "Bad src info");
> +       cil_destroy_src_info(info);
>         return rc;
>  }
>
> diff --git a/libsepol/cil/src/cil_copy_ast.c b/libsepol/cil/src/cil_copy_ast.c
> index 9c0231f2..02b9828f 100644
> --- a/libsepol/cil/src/cil_copy_ast.c
> +++ b/libsepol/cil/src/cil_copy_ast.c
> @@ -1692,7 +1692,8 @@ int cil_copy_src_info(__attribute__((unused)) struct cil_db *db, void *data, voi
>
>         cil_src_info_init(&new);
>
> -       new->is_cil = orig->is_cil;
> +       new->kind = orig->kind;
> +       new->hll_line = orig->hll_line;
>         new->path = orig->path;
>
>         *copy = new;
> diff --git a/libsepol/cil/src/cil_internal.h b/libsepol/cil/src/cil_internal.h
> index b9a03a37..385677d4 100644
> --- a/libsepol/cil/src/cil_internal.h
> +++ b/libsepol/cil/src/cil_internal.h
> @@ -236,7 +236,9 @@ extern char *CIL_KEY_IOCTL;
>  extern char *CIL_KEY_UNORDERED;
>  extern char *CIL_KEY_SRC_INFO;
>  extern char *CIL_KEY_SRC_CIL;
> -extern char *CIL_KEY_SRC_HLL;
> +extern char *CIL_KEY_SRC_HLL_LMS;
> +extern char *CIL_KEY_SRC_HLL_LMX;
> +extern char *CIL_KEY_SRC_HLL_LME;
>
>  /*
>         Symbol Table Array Indices
> @@ -963,7 +965,8 @@ struct cil_mls {
>  };
>
>  struct cil_src_info {
> -       int is_cil;
> +       char *kind;
> +       uint32_t hll_line;
>         char *path;
>  };
>
> diff --git a/libsepol/cil/src/cil_parser.c b/libsepol/cil/src/cil_parser.c
> index 9ca1432e..842c327c 100644
> --- a/libsepol/cil/src/cil_parser.c
> +++ b/libsepol/cil/src/cil_parser.c
> @@ -44,10 +44,6 @@
>
>  #define CIL_PARSER_MAX_EXPR_DEPTH (0x1 << 12)
>
> -char *CIL_KEY_HLL_LMS;
> -char *CIL_KEY_HLL_LMX;
> -char *CIL_KEY_HLL_LME;
> -
>  struct hll_info {
>         uint32_t hll_lineno;
>         uint32_t hll_expand;
> @@ -102,7 +98,6 @@ static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_lineno
>         char *hll_type;
>         struct cil_tree_node *node;
>         struct token tok;
> -       char *hll_file;
>         int rc;
>
>         cil_lexer_next(&tok);
> @@ -111,11 +106,11 @@ static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_lineno
>                 goto exit;
>         }
>         hll_type = cil_strpool_add(tok.value);
> -       if (hll_type != CIL_KEY_HLL_LME && hll_type != CIL_KEY_HLL_LMS && hll_type != CIL_KEY_HLL_LMX) {
> +       if (hll_type != CIL_KEY_SRC_HLL_LME && hll_type != CIL_KEY_SRC_HLL_LMS && hll_type != CIL_KEY_SRC_HLL_LMX) {
>                 cil_log(CIL_ERR, "Invalid line mark syntax\n");
>                 goto exit;
>         }
> -       if (hll_type == CIL_KEY_HLL_LME) {
> +       if (hll_type == CIL_KEY_SRC_HLL_LME) {
>                 if (cil_stack_is_empty(stack)) {
>                         cil_log(CIL_ERR, "Line mark end without start\n");
>                         goto exit;
> @@ -132,7 +127,7 @@ static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_lineno
>                 create_node(&node, *current, tok.line, *hll_lineno, CIL_KEY_SRC_INFO);
>                 insert_node(node, *current);
>
> -               create_node(&node, *current, tok.line, *hll_lineno, CIL_KEY_SRC_HLL);
> +               create_node(&node, *current, tok.line, *hll_lineno, hll_type);
>                 insert_node(node, *current);
>
>                 cil_lexer_next(&tok);
> @@ -141,12 +136,15 @@ static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_lineno
>                         goto exit;
>                 }
>
> +               create_node(&node, *current, tok.line, *hll_lineno, cil_strpool_add(tok.value));
> +               insert_node(node, *current);
> +
>                 rc = cil_string_to_uint32(tok.value, hll_lineno, 10);
>                 if (rc != SEPOL_OK) {
>                         goto exit;
>                 }
>
> -               *hll_expand = (hll_type == CIL_KEY_HLL_LMX) ? 1 : 0;
> +               *hll_expand = (hll_type == CIL_KEY_SRC_HLL_LMX) ? 1 : 0;
>
>                 cil_lexer_next(&tok);
>                 if (tok.type != SYMBOL && tok.type != QSTRING) {
> @@ -159,9 +157,7 @@ static int add_hll_linemark(struct cil_tree_node **current, uint32_t *hll_lineno
>                         tok.value = tok.value+1;
>                 }
>
> -               hll_file = cil_strpool_add(tok.value);
> -
> -               create_node(&node, *current, tok.line, *hll_lineno, hll_file);
> +               create_node(&node, *current, tok.line, *hll_lineno, cil_strpool_add(tok.value));
>                 insert_node(node, *current);
>         }
>
> @@ -192,6 +188,9 @@ static void add_cil_path(struct cil_tree_node **current, char *path)
>         create_node(&node, *current, 0, 0, CIL_KEY_SRC_CIL);
>         insert_node(node, *current);
>
> +       create_node(&node, *current, 0, 0, "1");
> +       insert_node(node, *current);
> +

Using this raw "1" here looks strange, while every other case uses
cil_strpool_add indirections. gcc complains about this:

../cil/src/cil_parser.c: In function ‘add_cil_path’:
../cil/src/cil_parser.c:205:44: error: passing argument 5 of
‘create_node’ discards ‘const’ qualifier from pointer target type
[-Werror=discarded-qualifiers]
  205 |         create_node(&node, *current, 0, 0, "1");
      |                                            ^~~
../cil/src/cil_parser.c:76:127: note: expected ‘void *’ but argument
is of type ‘const char *’
   76 | tree_node **node, struct cil_tree_node *current, uint32_t
line, uint32_t hll_offset, void *value)
      |

I understand that cil_strpool_add is used in order to be able to
quickly compare some strings using raw pointer comparisons. So I do
not know whether a proper fix would consist in using create_note(...,
(void *)"1") or in introducing a char *CIL_KEY_ONE =
cil_strpool_add("1"), or in making (struct cil_tree_node).data const.

>         create_node(&node, *current, 0, 0, path);
>         insert_node(node, *current);
>  }
> @@ -211,10 +210,6 @@ int cil_parser(const char *_path, char *buffer, uint32_t size, struct cil_tree *
>         struct token tok;
>         int rc = SEPOL_OK;
>
> -       CIL_KEY_HLL_LMS = cil_strpool_add("lms");
> -       CIL_KEY_HLL_LMX = cil_strpool_add("lmx");
> -       CIL_KEY_HLL_LME = cil_strpool_add("lme");
> -
>         cil_stack_init(&stack);
>
>         cil_lexer_setup(buffer, size);
> diff --git a/libsepol/cil/src/cil_tree.c b/libsepol/cil/src/cil_tree.c
> index 4cf8dcc8..52b28999 100644
> --- a/libsepol/cil/src/cil_tree.c
> +++ b/libsepol/cil/src/cil_tree.c
> @@ -71,7 +71,7 @@ struct cil_tree_node *cil_tree_get_next_path(struct cil_tree_node *node, char **
>                                 /* AST */
>                                 struct cil_src_info *info = node->data;
>                                 *path = info->path;
> -                               *is_cil = info->is_cil;
> +                               *is_cil = (info->kind == CIL_KEY_SRC_CIL);
>                                 return node;
>                 } else {
>                         if (node->flavor == CIL_CALL) {
> --
> 2.31.1
>




[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux