Signed-off-by: John Johansen <john.johan...@canonical.com> --- parser/parser.h | 3 ++- parser/parser_lex.l | 17 +++++++++++++++++ parser/parser_misc.c | 4 +++- parser/parser_yacc.y | 15 +++++++++++++-- parser/tst/simple_tests/mount/in_1.sd | 7 +++++++ parser/tst/simple_tests/mount/in_1.sd~ | 7 +++++++ parser/tst/simple_tests/mount/in_2.sd | 7 +++++++ parser/tst/simple_tests/mount/in_2.sd~ | 7 +++++++ parser/tst/simple_tests/mount/in_3.sd | 7 +++++++ parser/tst/simple_tests/mount/in_3.sd~ | 7 +++++++ parser/tst/simple_tests/mount/in_4.sd | 7 +++++++ parser/tst/simple_tests/mount/in_4.sd~ | 7 +++++++ 12 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 parser/tst/simple_tests/mount/in_1.sd create mode 100644 parser/tst/simple_tests/mount/in_1.sd~ create mode 100644 parser/tst/simple_tests/mount/in_2.sd create mode 100644 parser/tst/simple_tests/mount/in_2.sd~ create mode 100644 parser/tst/simple_tests/mount/in_3.sd create mode 100644 parser/tst/simple_tests/mount/in_3.sd~ create mode 100644 parser/tst/simple_tests/mount/in_4.sd create mode 100644 parser/tst/simple_tests/mount/in_4.sd~
diff --git a/parser/parser.h b/parser/parser.h index 799d44b..fa2d191 100644 --- a/parser/parser.h +++ b/parser/parser.h @@ -62,6 +62,7 @@ struct value_list { struct cond_entry { char *name; + int eq; /* where equals was used in specifying list */ struct value_list *vals; struct cond_entry *next; @@ -316,7 +317,7 @@ extern struct value_list *new_value_list(char *value); extern struct value_list *dup_value_list(struct value_list *list); extern void free_value_list(struct value_list *list); extern void print_value_list(struct value_list *list); -extern struct cond_entry *new_cond_entry(char *name, struct value_list *list); +extern struct cond_entry *new_cond_entry(char *name, int eq, struct value_list *list); extern void free_cond_entry(struct cond_entry *ent); extern void print_cond_entry(struct cond_entry *ent); extern char *processid(char *string, int len); diff --git a/parser/parser_lex.l b/parser/parser_lex.l index b5627ad..529c079 100644 --- a/parser/parser_lex.l +++ b/parser/parser_lex.l @@ -280,6 +280,18 @@ LT_EQUAL <= yy_push_state(EXTCOND_MODE); return TOK_CONDID; } + {VARIABLE_NAME}/{WS}*in { + /* we match to 'in' in the lexer so that + * we can switch scanner state. By the time + * the parser see the 'in' it may be to late + * as bison may have requested the next + * token from the scanner + */ + PDEBUG("conditional %s=\n", yytext); + yylval.id = processid(yytext, yyleng); + yy_push_state(EXTCOND_MODE); + return TOK_CONDID; + } } <SUB_ID>{ @@ -384,6 +396,11 @@ LT_EQUAL <= return TOK_OPENPAREN; } + in { + DUMP_PREPROCESS; + return TOK_IN; + } + [^\n] { DUMP_PREPROCESS; /* Something we didn't expect */ diff --git a/parser/parser_misc.c b/parser/parser_misc.c index 7ff6348..9d2fc4b 100644 --- a/parser/parser_misc.c +++ b/parser/parser_misc.c @@ -84,6 +84,7 @@ static struct keyword_table keyword_table[] = { {"umount", TOK_UMOUNT}, {"unmount", TOK_UMOUNT}, {"pivot_root", TOK_PIVOTROOT}, + {"in", TOK_IN}, /* terminate */ {NULL, 0} }; @@ -1025,12 +1026,13 @@ void print_value_list(struct value_list *list) } } -struct cond_entry *new_cond_entry(char *name, struct value_list *list) +struct cond_entry *new_cond_entry(char *name, int eq, struct value_list *list) { struct cond_entry *ent = calloc(1, sizeof(struct cond_entry)); if (ent) { ent->name = name; ent->vals = list; + ent->eq = eq; } return ent; diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y index 65cf365..a79be85 100644 --- a/parser/parser_yacc.y +++ b/parser/parser_yacc.y @@ -121,6 +121,7 @@ void add_local_entry(struct codomain *cod); %token TOK_REMOUNT %token TOK_UMOUNT %token TOK_PIVOTROOT +%token TOK_IN /* rlimits */ %token TOK_RLIMIT @@ -1072,7 +1073,7 @@ cond: TOK_CONDID TOK_EQUALS TOK_VALUE struct value_list *value = new_value_list($3); if (!value) yyerror(_("Memory allocation error.")); - ent = new_cond_entry($1, value); + ent = new_cond_entry($1, 1, value); if (!ent) { free_value_list(value); yyerror(_("Memory allocation error.")); @@ -1082,7 +1083,17 @@ cond: TOK_CONDID TOK_EQUALS TOK_VALUE cond: TOK_CONDID TOK_EQUALS TOK_OPENPAREN valuelist TOK_CLOSEPAREN { - struct cond_entry *ent = new_cond_entry($1, $4); + struct cond_entry *ent = new_cond_entry($1, 1, $4); + + if (!ent) + yyerror(_("Memory allocation error.")); + $$ = ent; + } + + +cond: TOK_CONDID TOK_IN TOK_OPENPAREN valuelist TOK_CLOSEPAREN + { + struct cond_entry *ent = new_cond_entry($1, 0, $4); if (!ent) yyerror(_("Memory allocation error.")); diff --git a/parser/tst/simple_tests/mount/in_1.sd b/parser/tst/simple_tests/mount/in_1.sd new file mode 100644 index 0000000..076d5dc --- /dev/null +++ b/parser/tst/simple_tests/mount/in_1.sd @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options in (rw) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_1.sd~ b/parser/tst/simple_tests/mount/in_1.sd~ new file mode 100644 index 0000000..3b552f7 --- /dev/null +++ b/parser/tst/simple_tests/mount/in_1.sd~ @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options=(rw) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_2.sd b/parser/tst/simple_tests/mount/in_2.sd new file mode 100644 index 0000000..5bf4beb --- /dev/null +++ b/parser/tst/simple_tests/mount/in_2.sd @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options in (rw, ro) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_2.sd~ b/parser/tst/simple_tests/mount/in_2.sd~ new file mode 100644 index 0000000..12c21aa --- /dev/null +++ b/parser/tst/simple_tests/mount/in_2.sd~ @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options=(rw, ro) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_3.sd b/parser/tst/simple_tests/mount/in_3.sd new file mode 100644 index 0000000..cd5bae5 --- /dev/null +++ b/parser/tst/simple_tests/mount/in_3.sd @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options in (rw ro) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_3.sd~ b/parser/tst/simple_tests/mount/in_3.sd~ new file mode 100644 index 0000000..08aa1bb --- /dev/null +++ b/parser/tst/simple_tests/mount/in_3.sd~ @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options=(rw ro) -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_4.sd b/parser/tst/simple_tests/mount/in_4.sd new file mode 100644 index 0000000..8acaa88 --- /dev/null +++ b/parser/tst/simple_tests/mount/in_4.sd @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options in (rw ro) fstype=procfs -> /foo, +} diff --git a/parser/tst/simple_tests/mount/in_4.sd~ b/parser/tst/simple_tests/mount/in_4.sd~ new file mode 100644 index 0000000..96a93a2 --- /dev/null +++ b/parser/tst/simple_tests/mount/in_4.sd~ @@ -0,0 +1,7 @@ +# +#=Description basic mount rule +#=EXRESULT PASS +# +/usr/bin/foo { + mount options=(rw ro) fstype=procfs -> /foo, +} -- 1.7.9.1 -- AppArmor mailing list AppArmor@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor