[apparmor] [PATCH 10/14] Fix: refactor change_profile to deal with unexpected TOK_ID error
John Johansen
john.johansen at canonical.com
Thu Jun 4 10:56:39 UTC 2015
bison isn't properly handling the 3 options of
TOK_CHANGE_PROFILE opt_id TOK_END_OF_RULE
TOK_CHANGE_PROFILE opt_id TOK_ARROW TOK_ID TOK_END_OF_RULE
TOK_CHANGE_PROFILE opt_id TOK_ARROW TOK_COLON TOK_ID TOK_COLON TOK_END_OF_RULE
specifying
change_profile /exec,
results in an unexpected TOK_ID error
refactor so that they share the 3 options share a common head which fixes
the problem.
Signed-off-by: John Johansen <john.johansen at canonical.com>
---
parser/parser_yacc.y | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y
index 4ae5bf3..baa900b 100644
--- a/parser/parser_yacc.y
+++ b/parser/parser_yacc.y
@@ -244,6 +244,7 @@ void add_local_entry(Profile *prof);
%type <flags> flagval
%type <cap> caps
%type <cap> capability
+%type <id> change_profile_head
%type <user_entry> change_profile
%type <set_var> TOK_SET_VAR
%type <bool_var> TOK_BOOL_VAR
@@ -1491,42 +1492,43 @@ file_mode: TOK_MODE
free($1);
}
-change_profile: TOK_CHANGE_PROFILE opt_id TOK_END_OF_RULE
+change_profile_head: TOK_CHANGE_PROFILE opt_id
+ {
+ if ($2 && !($2[0] == '/' || strncmp($2, "@{", 2) == 0))
+ yyerror(_("Exec condition must begin with '/'."));
+ $$ = $2;
+ }
+
+change_profile: change_profile_head TOK_END_OF_RULE
{
struct cod_entry *entry;
char *rule = strdup("**");
if (!rule)
yyerror(_("Memory allocation error."));
PDEBUG("Matched change_profile,\n");
- if ($2 && !($2[0] == '/' || strncmp($2, "@{", 2) == 0))
- yyerror(_("Exec condition must begin with '/'."));
- entry = new_entry(NULL, rule, AA_CHANGE_PROFILE, $2);
+ entry = new_entry(NULL, rule, AA_CHANGE_PROFILE, $1);
if (!entry)
yyerror(_("Memory allocation error."));
PDEBUG("change_profile,\n");
$$ = entry;
};
-change_profile: TOK_CHANGE_PROFILE opt_id TOK_ARROW TOK_ID TOK_END_OF_RULE
+change_profile: change_profile_head TOK_ARROW TOK_ID TOK_END_OF_RULE
{
struct cod_entry *entry;
- PDEBUG("Matched change_profile: tok_id (%s)\n", $4);
- if ($2 && !($2[0] == '/' || strncmp($2, "@{", 2) == 0))
- yyerror(_("Exec condition must begin with '/'."));
- entry = new_entry(NULL, $4, AA_CHANGE_PROFILE, $2);
+ PDEBUG("Matched change_profile: tok_id (%s)\n", $3);
+ entry = new_entry(NULL, $3, AA_CHANGE_PROFILE, $1);
if (!entry)
yyerror(_("Memory allocation error."));
PDEBUG("change_profile.entry: (%s)\n", entry->name);
$$ = entry;
};
-change_profile: TOK_CHANGE_PROFILE opt_id TOK_ARROW TOK_COLON TOK_ID TOK_COLON TOK_ID TOK_END_OF_RULE
+change_profile: change_profile_head TOK_ARROW TOK_COLON TOK_ID TOK_COLON TOK_ID TOK_END_OF_RULE
{
struct cod_entry *entry;
- PDEBUG("Matched change_profile: tok_id (%s:%s)\n", $5, $7);
- if ($2 && !($2[0] == '/' || strncmp($2, "@{", 2) == 0))
- yyerror(_("Exec condition must begin with '/'."));
- entry = new_entry($5, $7, AA_CHANGE_PROFILE, $2);
+ PDEBUG("Matched change_profile: tok_id (%s:%s)\n", $4, $6);
+ entry = new_entry($4, $6, AA_CHANGE_PROFILE, $1);
if (!entry)
yyerror(_("Memory allocation error."));
PDEBUG("change_profile.entry: (%s)\n", entry->name);
--
2.1.4
More information about the AppArmor
mailing list