On Tue, Apr 15, 2014 at 10:22:25AM -0700, john.johan...@canonical.com wrote: > The match > {VARIABLE_NAME}/{WS}*={WS}*\( > > is too broad causing mount and dbus rules to fail for sets of values eg. > > mount options=(ro bind) > > Instead of doing a broad match, for now lets lock it down to just > peer=(...) being the only cond that can cause entry into CONDLISTID > > Signed-off-by: John Johansen <john.johan...@canonical.com>
Acked-by: Seth Arnold <seth.arn...@canonical.com> Thanks > > --- > parser/dbus.c | 22 ++++++---------------- > parser/parser.h | 8 ++++++++ > parser/parser_lex.l | 18 ++++++++++-------- > parser/parser_misc.c | 11 +++++++++++ > parser/parser_yacc.y | 25 ++++++++++++++----------- > parser/signal.c | 7 ++++--- > parser/signal.h | 2 +- > 7 files changed, 54 insertions(+), 39 deletions(-) > > --- 2.9-test.orig/parser/dbus.c > +++ 2.9-test/parser/dbus.c > @@ -38,16 +38,6 @@ > return parse_X_mode("DBus", AA_VALID_DBUS_PERMS, str_mode, mode, fail); > } > > -static void move_conditional_value(char **dst_ptr, struct cond_entry > *cond_ent) > -{ > - if (*dst_ptr) > - yyerror("dbus conditional \"%s\" can only be specified once\n", > - cond_ent->name); > - > - *dst_ptr = cond_ent->vals->value; > - cond_ent->vals->value = NULL; > -} > - > void dbus_rule::move_conditionals(struct cond_entry *conds) > { > struct cond_entry *cond_ent; > @@ -61,17 +51,17 @@ > cond_ent->name); > > if (strcmp(cond_ent->name, "bus") == 0) { > - move_conditional_value(&bus, cond_ent); > + move_conditional_value("dbus", &bus, cond_ent); > } else if (strcmp(cond_ent->name, "name") == 0) { > - move_conditional_value(&name, cond_ent); > + move_conditional_value("dbus", &name, cond_ent); > } else if (strcmp(cond_ent->name, "label") == 0) { > - move_conditional_value(&peer_label, cond_ent); > + move_conditional_value("dbus", &peer_label, cond_ent); > } else if (strcmp(cond_ent->name, "path") == 0) { > - move_conditional_value(&path, cond_ent); > + move_conditional_value("dbus", &path, cond_ent); > } else if (strcmp(cond_ent->name, "interface") == 0) { > - move_conditional_value(&interface, cond_ent); > + move_conditional_value("dbus", &interface, cond_ent); > } else if (strcmp(cond_ent->name, "member") == 0) { > - move_conditional_value(&member, cond_ent); > + move_conditional_value("dbus", &member, cond_ent); > } else { > yyerror("invalid dbus conditional \"%s\"\n", > cond_ent->name); > --- 2.9-test.orig/parser/parser.h > +++ 2.9-test/parser/parser.h > @@ -78,6 +78,12 @@ > struct cond_entry *next; > }; > > +struct cond_entry_list { > + char *name; > + > + struct cond_entry *list; > +}; > + > struct cod_entry { > char *ns; > char *name; > @@ -362,6 +368,8 @@ > 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, int eq, struct > value_list *list); > +extern void move_conditional_value(const char *rulename, char **dst_ptr, > + struct cond_entry *cond_ent); > extern void free_cond_entry(struct cond_entry *ent); > extern void free_cond_list(struct cond_entry *ents); > extern void print_cond_entry(struct cond_entry *ent); > --- 2.9-test.orig/parser/parser_lex.l > +++ 2.9-test/parser/parser_lex.l > @@ -295,19 +295,21 @@ > } > > <INITIAL,MOUNT_MODE,DBUS_MODE,SIGNAL_MODE>{ > + {VARIABLE_NAME}/{WS}*={WS}*\( { > + /* we match to the = in the lexer so that we can switch scanner > + * state. By the time the parser see the = it may be too late > + * as bison may have requested the next token from the scanner > + */ > + yylval.id = processid(yytext, yyleng); > + PUSH_AND_RETURN(EXTCONDLIST_MODE, TOK_CONDLISTID); > + } > {VARIABLE_NAME}/{WS}*= { > /* we match to the = in the lexer so that we can switch scanner > * state. By the time the parser see the = it may be too late > * as bison may have requested the next token from the scanner > */ > - int token = get_keyword_token(yytext); > - > - if (token == TOK_PEER) { > - PUSH_AND_RETURN(EXTCONDLIST_MODE, TOK_CONDLISTID); > - } else { > - yylval.id = processid(yytext, yyleng); > - PUSH_AND_RETURN(EXTCOND_MODE, TOK_CONDID); > - } > + yylval.id = processid(yytext, yyleng); > + PUSH_AND_RETURN(EXTCOND_MODE, TOK_CONDID); > } > {VARIABLE_NAME}/{WS}+in{WS}*\( { > /* we match to 'in' in the lexer so that we can switch scanner > --- 2.9-test.orig/parser/parser_misc.c > +++ 2.9-test/parser/parser_misc.c > @@ -1205,6 +1205,17 @@ > } > } > > +void move_conditional_value(const char *rulename, char **dst_ptr, > + struct cond_entry *cond_ent) > +{ > + if (*dst_ptr) > + yyerror("%s conditional \"%s\" can only be specified once\n", > + rulename, cond_ent->name); > + > + *dst_ptr = cond_ent->vals->value; > + cond_ent->vals->value = NULL; > +} > + > struct cond_entry *new_cond_entry(char *name, int eq, struct value_list > *list) > { > struct cond_entry *ent = (struct cond_entry *) calloc(1, sizeof(struct > cond_entry)); > --- 2.9-test.orig/parser/parser_yacc.y > +++ 2.9-test/parser/parser_yacc.y > @@ -166,6 +166,7 @@ > %token TOK_FLAGS > > %code requires { > + #include "parser.h" > #include "profile.h" > #include "mount.h" > #include "dbus.h" > @@ -194,6 +195,7 @@ > char *var_val; > struct value_list *val_list; > struct cond_entry *cond_entry; > + struct cond_entry_list cond_entry_list; > int boolean; > struct named_transition transition; > struct prefixes prefix; > @@ -219,8 +221,8 @@ > %type <mnt_entry> mnt_rule > %type <cond_entry> opt_conds > %type <cond_entry> cond > -%type <cond_entry> cond_list > -%type <cond_entry> opt_cond_list > +%type <cond_entry_list> cond_list > +%type <cond_entry_list> opt_cond_list > %type <flags> flags > %type <flags> flagvals > %type <flags> flagval > @@ -1145,10 +1147,11 @@ > > cond_list: TOK_CONDLISTID TOK_EQUALS TOK_OPENPAREN opt_conds TOK_CLOSEPAREN > { > - $$ = $4; > + $$.name = $1; > + $$.list = $4; > } > > -opt_cond_list: { /* nothing */ $$ = NULL; } > +opt_cond_list: { /* nothing */ $$ = { NULL, NULL }; } > | cond_list { $$ = $1; } > > mnt_rule: TOK_MOUNT opt_conds opt_id TOK_END_OF_RULE > @@ -1232,7 +1235,12 @@ > { > dbus_rule *ent; > > - ent = new dbus_rule($2, $3, $4); > + if ($4.name) { > + if (strcmp($4.name, "peer") != 0) > + yyerror(_("dbus rule: invalid conditional group > %s=()"), $4.name); > + free($4.name); > + } > + ent = new dbus_rule($2, $3, $4.list); > if (!ent) { > yyerror(_("Memory allocation error.")); > } > @@ -1273,12 +1281,7 @@ > > signal_rule: TOK_SIGNAL opt_signal_perm opt_conds TOK_END_OF_RULE > { > - signal_rule *ent = new signal_rule($2, $3, NULL); > - $$ = ent; > - } > - | TOK_SIGNAL opt_signal_perm opt_conds TOK_ID TOK_END_OF_RULE > - { > - signal_rule *ent = new signal_rule($2, $3, $4); > + signal_rule *ent = new signal_rule($2, $3); > $$ = ent; > } > > --- 2.9-test.orig/parser/signal.c > +++ 2.9-test/parser/signal.c > @@ -165,6 +165,8 @@ > yyerror("keyword \"in\" is not allowed in signal > rules\n"); > if (strcmp(cond_ent->name, "set") == 0) { > extract_sigs(&cond_ent->vals); > + } else if (strcmp(cond_ent->name, "peer") == 0) { > + move_conditional_value("signal", &peer_label, cond_ent); > } else { > yyerror("invalid signal rule conditional \"%s\"\n", > cond_ent->name); > @@ -172,9 +174,8 @@ > } > } > > -signal_rule::signal_rule(int mode_p, struct cond_entry *conds, > - char *peer): > - signals(), peer_label(peer), audit(0), deny(0) > +signal_rule::signal_rule(int mode_p, struct cond_entry *conds): > + signals(), peer_label(NULL), audit(0), deny(0) > { > if (mode_p) { > mode = mode_p; > --- 2.9-test.orig/parser/signal.h > +++ 2.9-test/parser/signal.h > @@ -43,7 +43,7 @@ > int audit; > int deny; > > - signal_rule(int mode, struct cond_entry *conds, char *peer); > + signal_rule(int mode, struct cond_entry *conds); > virtual ~signal_rule() { > signals.clear(); > free(peer_label); > > > -- > AppArmor mailing list > AppArmor@lists.ubuntu.com > Modify settings or unsubscribe at: > https://lists.ubuntu.com/mailman/listinfo/apparmor >
signature.asc
Description: Digital signature
-- AppArmor mailing list AppArmor@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/apparmor