value_list can be reused by conditionals and list values, so pull it out
and abstract it some more.

Signed-off-by: John Johansen <[email protected]>
---
 parser/parser.h      |    9 +++++++++
 parser/parser_misc.c |   35 +++++++++++++++++++++++++++++++++++
 parser/parser_yacc.y |   36 +++++++-----------------------------
 3 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/parser/parser.h b/parser/parser.h
index ebe0e29..6c1cc4f 100644
--- a/parser/parser.h
+++ b/parser/parser.h
@@ -49,6 +49,12 @@ struct cod_pattern {
        char *regex;            // posix regex
 };
 
+struct value_list {
+       char *value;
+
+       struct value_list *next;
+};
+
 struct cod_entry {
        char *namespace;
        char *name;
@@ -275,6 +281,9 @@ extern struct var_string *split_out_var(char *string);
 extern void free_var_string(struct var_string *var);
 
 /* parser_misc.c */
+extern struct value_list *new_value_list(char *value);
+extern void free_value_list(struct value_list *list);
+extern void print_value_list(struct value_list *list);
 extern char *processid(char *string, int len);
 extern char *processquoted(char *string, int len);
 extern char *processunquoted(char *string, int len);
diff --git a/parser/parser_misc.c b/parser/parser_misc.c
index 8aca061..f1779c7 100644
--- a/parser/parser_misc.c
+++ b/parser/parser_misc.c
@@ -939,6 +939,41 @@ void debug_cod_list(struct codomain *cod)
        dump_policy_hats(cod);
 }
 
+struct value_list *new_value_list(char *value)
+{
+       struct value_list *val = calloc(1, sizeof(struct value_list));
+       if (val)
+               val->value = value;
+       return val;
+}
+
+void free_value_list(struct value_list *list)
+{
+       struct value_list *next;
+
+       while (list) {
+               next = list->next;
+               if (list->value)
+                       free(list->value);
+               free(list);
+               list = next;
+       }
+}
+
+void print_value_list(struct value_list *list)
+{
+       struct value_list *entry;
+
+       if (!list)
+               return;
+
+       fprintf(stderr, "%s", list->value);
+       list = list->next;
+       list_for_each(list, entry) {
+               fprintf(stderr, ", %s", entry->value);
+       }
+}
+
 #ifdef UNIT_TEST
 int test_str_to_boolean(void)
 {
diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y
index 6dfbee8..27eacf1 100644
--- a/parser/parser_yacc.y
+++ b/parser/parser_yacc.y
@@ -64,14 +64,8 @@
 
 #define CAP_TO_MASK(x) (1ull << (x))
 
-struct value_list {
-       char *value;
-       struct value_list *next;
-};
-
 int parser_token = 0;
 
-void free_value_list(struct value_list *list);
 struct cod_entry *do_file_rule(char *namespace, char *id, int mode,
                               char *link_id, char *nt);
 
@@ -378,26 +372,23 @@ varassign:        TOK_BOOL_VAR TOK_EQUALS TOK_VALUE
 
 valuelist:     TOK_VALUE
        {
-               struct value_list *new = calloc(1, sizeof(struct value_list));
-               if (!new)
+               struct value_list *val = new_value_list($1);
+               if (!val)
                        yyerror(_("Memory allocation error."));
                PDEBUG("Matched: value (%s)\n", $1);
 
-               new->value = $1;
-               new->next = NULL;
-               $$ = new;
+               $$ = val;
        }
 
 valuelist:     valuelist TOK_VALUE
        {
-               struct value_list *new = calloc(1, sizeof(struct value_list));
-               if (!new)
+               struct value_list *val = new_value_list($2);
+               if (!val)
                        yyerror(_("Memory allocation error."));
                PDEBUG("Matched: value list\n");
 
-               new->value = $2;
-               new->next = $1;
-               $$ = new;
+               val->next = $1;
+               $$ = val;
        }
 
 flags: { /* nothing */
@@ -1115,19 +1106,6 @@ void yyerror(char *msg, ...)
        exit(1);
 }
 
-void free_value_list(struct value_list *list)
-{
-       struct value_list *next;
-
-       while (list) {
-               next = list->next;
-               if (list->value)
-                       free(list->value);
-               free(list);
-               list = next;
-       }
-}
-
 struct cod_entry *do_file_rule(char *namespace, char *id, int mode,
                               char *link_id, char *nt)
 {
-- 
1.7.9


-- 
AppArmor mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/apparmor

Reply via email to