From 835605a6477be5a62c7d6f17c5945ba6d3762e0b Mon Sep 17 00:00:00 2001 From: John Johansen Date: Fri, 10 Jul 2015 18:11:17 -0700 Subject: [PATCH] Add support for variable expansion in profile names, and attachments allow @{FOO}=bar /foo@{FOO} { } to be expanded into /foobar { } and @{FOO}=bar baz /foo@{FOO} { } to be expanded into /foo{bar,baz} { } which is used as a regular expression for attachment purposes Further allow variable expansion in attachment specifications profile foo /foo@{FOO} { } profile name (if begun with profile keyword) and attachments to begin with a variable profile @{FOO} { } profile /foo @{FOO} { } profile @{FOO} @{BAR} {} hats ^@{FOO} hat @{FOO} and for subprofiles as well Signed-off-by: John Johansen Acked-by: Steve Beattie --- parser/parser_variable.c | 19 ++++++++++++++++++- parser/parser_yacc.y | 13 +++++++------ .../simple_tests/vars/vars_profile_name_01.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_02.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_03.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_04.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_05.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_06.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_07.sd | 10 ++++++++++ .../simple_tests/vars/vars_profile_name_08.sd | 10 ++++++++++ .../simple_tests/vars/vars_profile_name_09.sd | 9 +++++++++ .../simple_tests/vars/vars_profile_name_10.sd | 9 +++++++++ .../simple_tests/vars/vars_profile_name_11.sd | 9 +++++++++ .../simple_tests/vars/vars_profile_name_12.sd | 11 +++++++++++ .../simple_tests/vars/vars_profile_name_13.sd | 11 +++++++++++ .../simple_tests/vars/vars_profile_name_14.sd | 11 +++++++++++ .../simple_tests/vars/vars_profile_name_15.sd | 11 +++++++++++ .../simple_tests/vars/vars_profile_name_16.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_17.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_18.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_19.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_20.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_21.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_22.sd | 10 ++++++++++ .../simple_tests/vars/vars_profile_name_23.sd | 7 +++++++ .../simple_tests/vars/vars_profile_name_24.sd | 8 ++++++++ .../simple_tests/vars/vars_profile_name_25.sd | 10 ++++++++++ .../simple_tests/vars/vars_profile_name_26.sd | 10 ++++++++++ .../vars/vars_profile_name_bad_1.sd | 8 ++++++++ .../vars/vars_profile_name_bad_2.sd | 6 ++++++ 30 files changed, 271 insertions(+), 7 deletions(-) create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_01.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_02.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_03.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_04.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_05.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_06.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_07.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_08.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_09.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_10.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_11.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_12.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_13.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_14.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_15.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_16.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_17.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_18.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_19.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_20.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_21.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_22.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_23.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_24.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_25.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_26.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_bad_1.sd create mode 100644 parser/tst/simple_tests/vars/vars_profile_name_bad_2.sd diff --git a/parser/parser_variable.c b/parser/parser_variable.c index ac334dcde..7250c0be9 100644 --- a/parser/parser_variable.c +++ b/parser/parser_variable.c @@ -275,12 +275,29 @@ static int process_variables_in_rules(Profile &prof) return 0; } +static int process_variables_in_name(Profile &prof) +{ + /* this needs to be done before alias expansion, ie. altnames are + * setup + */ + int error = expand_entry_variables(&prof.name); + if (!error && prof.attachment) + error = expand_entry_variables(&prof.attachment); + + return error; +} int process_profile_variables(Profile *prof) { int error = 0, rc; - error = new_set_var(PROFILE_NAME_VARIABLE, prof->get_name(true).c_str()); + /* needs to be before PROFILE_NAME_VARIABLE so that variable will + * have the correct name + */ + error = process_variables_in_name(*prof); + + if (!error) + error = new_set_var(PROFILE_NAME_VARIABLE, prof->get_name(true).c_str()); if (!error) error = process_variables_in_entries(prof->entries); diff --git a/parser/parser_yacc.y b/parser/parser_yacc.y index b3083d56a..d529e97d0 100644 --- a/parser/parser_yacc.y +++ b/parser/parser_yacc.y @@ -252,6 +252,7 @@ void add_local_entry(Profile *prof); %type valuelist %type expr %type id_or_var +%type opt_id_or_var %type opt_subset_flag %type opt_audit_flag %type opt_owner_flag @@ -307,7 +308,10 @@ opt_ns: { /* nothing */ $$ = NULL; } opt_id: { /* nothing */ $$ = NULL; } | TOK_ID { $$ = $1; } -profile_base: TOK_ID opt_id flags TOK_OPEN rules TOK_CLOSE +opt_id_or_var: { /* nothing */ $$ = NULL; } + | id_or_var { $$ = $1; } + +profile_base: TOK_ID opt_id_or_var flags TOK_OPEN rules TOK_CLOSE { Profile *prof = $5; @@ -317,11 +321,8 @@ profile_base: TOK_ID opt_id flags TOK_OPEN rules TOK_CLOSE prof->name = $1; prof->attachment = $2; - if ($2 && $2[0] != '/') - /* we don't support variables as part of the profile - * name or attachment atm - */ - yyerror(_("Profile attachment must begin with a '/'.")); + if ($2 && !($2[0] == '/' || strncmp($2, "@{", 2) == 0)) + yyerror(_("Profile attachment must begin with a '/' or variable.")); prof->flags = $3; if (force_complain && kernel_abi_version == 5) /* newer abis encode force complain as part of the diff --git a/parser/tst/simple_tests/vars/vars_profile_name_01.sd b/parser/tst/simple_tests/vars/vars_profile_name_01.sd new file mode 100644 index 000000000..a83c2e786 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_01.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS + +@{FOO}=bar + +/does/not/exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_02.sd b/parser/tst/simple_tests/vars/vars_profile_name_02.sd new file mode 100644 index 000000000..672af43aa --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_02.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS + +@{FOO}=bar baz + +/does/not/exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_03.sd b/parser/tst/simple_tests/vars/vars_profile_name_03.sd new file mode 100644 index 000000000..23037c86e --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_03.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION profiles declared with the profile keyword can begin with var +#=EXRESULT PASS + +@{FOO}=bar + +profile @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_04.sd b/parser/tst/simple_tests/vars/vars_profile_name_04.sd new file mode 100644 index 000000000..32247591f --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_04.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION profiles declared with the profile keyword can begin with var +#=EXRESULT PASS + +@{FOO}=bar baz + +profile @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_05.sd b/parser/tst/simple_tests/vars/vars_profile_name_05.sd new file mode 100644 index 000000000..1fc0758b0 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_05.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not /exist{@{FOO},} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_06.sd b/parser/tst/simple_tests/vars/vars_profile_name_06.sd new file mode 100644 index 000000000..b051c24bb --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_06.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS + +@{FOO}=bar baz + +profile /does/not /exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_07.sd b/parser/tst/simple_tests/vars/vars_profile_name_07.sd new file mode 100644 index 000000000..6ec43e58a --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_07.sd @@ -0,0 +1,10 @@ +#=DESCRIPTION profiles declared with the profile keyword can begin with var +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=bar + +profile /does/not/exist @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_08.sd b/parser/tst/simple_tests/vars/vars_profile_name_08.sd new file mode 100644 index 000000000..99dfd5698 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_08.sd @@ -0,0 +1,10 @@ +#=DESCRIPTION profiles declared with the profile keyword can begin with var +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=bar baz + +profile /does/not/exist @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_09.sd b/parser/tst/simple_tests/vars/vars_profile_name_09.sd new file mode 100644 index 000000000..69edff0f8 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_09.sd @@ -0,0 +1,9 @@ +#=DESCRIPTION reference variables in name and attachment +#=EXRESULT PASS + +@{FOO}=bar +@{BAR}=baz + +profile /does/not@{BAR} /exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_10.sd b/parser/tst/simple_tests/vars/vars_profile_name_10.sd new file mode 100644 index 000000000..e6a574fd9 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_10.sd @@ -0,0 +1,9 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS + +@{FOO}=bar baz +@{BAR}=baz + +profile /does/not@{BAR} /exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_11.sd b/parser/tst/simple_tests/vars/vars_profile_name_11.sd new file mode 100644 index 000000000..ed007f562 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_11.sd @@ -0,0 +1,9 @@ +#=DESCRIPTION profiles declared with the profile keyword have var and var attachment +#=EXRESULT PASS + +@{FOO}=/bar /baz +@{BAR}=baz foo + +profile /does/not/exist@{BAR} @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_12.sd b/parser/tst/simple_tests/vars/vars_profile_name_12.sd new file mode 100644 index 000000000..8e3a40540 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_12.sd @@ -0,0 +1,11 @@ +#=DESCRIPTION profiles declared with the profile keyword can expand var and have var attachment +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=bar baz +@{BAR}=baz foo + +profile /does/not/exist@{BAR} @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_13.sd b/parser/tst/simple_tests/vars/vars_profile_name_13.sd new file mode 100644 index 000000000..29797ec4e --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_13.sd @@ -0,0 +1,11 @@ +#=DESCRIPTION reference variables that are the profile name and attachment +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=bar +@{BAR}=baz + +profile @{BAR} @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_14.sd b/parser/tst/simple_tests/vars/vars_profile_name_14.sd new file mode 100644 index 000000000..feffe8139 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_14.sd @@ -0,0 +1,11 @@ +#=DESCRIPTION reference variables in rules that also have alternations +#=EXRESULT PASS +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=/bar /baz +@{BAR}=baz + +profile @{BAR} @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_15.sd b/parser/tst/simple_tests/vars/vars_profile_name_15.sd new file mode 100644 index 000000000..37aa3886b --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_15.sd @@ -0,0 +1,11 @@ +#=DESCRIPTION profiles declared with the profile keyword can begin with var +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=bar baz +@{BAR}=baz foo + +profile @{BAR} @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_16.sd b/parser/tst/simple_tests/vars/vars_profile_name_16.sd new file mode 100644 index 000000000..f2d66f2a0 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_16.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in sub profile name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + profile foo@{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_17.sd b/parser/tst/simple_tests/vars/vars_profile_name_17.sd new file mode 100644 index 000000000..1c44b8512 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_17.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in sub profile name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + profile @{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_18.sd b/parser/tst/simple_tests/vars/vars_profile_name_18.sd new file mode 100644 index 000000000..fd5b54fbd --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_18.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in hat name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + ^foo@{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_19.sd b/parser/tst/simple_tests/vars/vars_profile_name_19.sd new file mode 100644 index 000000000..1c44b8512 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_19.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in sub profile name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + profile @{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_20.sd b/parser/tst/simple_tests/vars/vars_profile_name_20.sd new file mode 100644 index 000000000..f2d66f2a0 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_20.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in sub profile name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + profile foo@{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_21.sd b/parser/tst/simple_tests/vars/vars_profile_name_21.sd new file mode 100644 index 000000000..a27b94cbb --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_21.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION var in hat name +#=EXRESULT PASS + +@{FOO}=bar + +profile /does/not/exist { + ^@{FOO} { } +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_22.sd b/parser/tst/simple_tests/vars/vars_profile_name_22.sd new file mode 100644 index 000000000..a42afba28 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_22.sd @@ -0,0 +1,10 @@ +#=DESCRIPTION all attachment expansions must start with / +#=EXRESULT FAIL +#=TODO +# This test needs check on @{FOO} attachment having leading / post var expansion + +@{FOO}=/bar baz + +profile /does/not/exist @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_23.sd b/parser/tst/simple_tests/vars/vars_profile_name_23.sd new file mode 100644 index 000000000..5bb212269 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_23.sd @@ -0,0 +1,7 @@ +#=DESCRIPTION reference variables in profile name is undefined +#=EXRESULT FAIL + + +/does/not/exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_24.sd b/parser/tst/simple_tests/vars/vars_profile_name_24.sd new file mode 100644 index 000000000..ebfb40324 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_24.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION reference variables is null +#=EXRESULT FAIL + +@{FOO}= + +/does/not/exist@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_25.sd b/parser/tst/simple_tests/vars/vars_profile_name_25.sd new file mode 100644 index 000000000..56ce8bae7 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_25.sd @@ -0,0 +1,10 @@ +#=DESCRIPTION reference variables is null +#=EXRESULT FAIL +#=TODO +#needs post var expansion check that variable contained a value + +@{FOO}= + +@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_26.sd b/parser/tst/simple_tests/vars/vars_profile_name_26.sd new file mode 100644 index 000000000..e81acb944 --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_26.sd @@ -0,0 +1,10 @@ +#=DESCRIPTION reference variables is null +#=EXRESULT FAIL +#=TODO +#needs post var expansion check that variable contained a value + +@{FOO}= + +profile bar @{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_bad_1.sd b/parser/tst/simple_tests/vars/vars_profile_name_bad_1.sd new file mode 100644 index 000000000..0b308c82c --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_bad_1.sd @@ -0,0 +1,8 @@ +#=DESCRIPTION bare profile names must start with / +#=EXRESULT FAIL + +@{FOO}=bar + +@{FOO} { + /does/not/exist r, +} diff --git a/parser/tst/simple_tests/vars/vars_profile_name_bad_2.sd b/parser/tst/simple_tests/vars/vars_profile_name_bad_2.sd new file mode 100644 index 000000000..009d0b86f --- /dev/null +++ b/parser/tst/simple_tests/vars/vars_profile_name_bad_2.sd @@ -0,0 +1,6 @@ +#=DESCRIPTION special @{profile_name} not defined for profile name declaration +#=EXRESULT FAIL + +profile @{profile_name} { + /does/not/exist r, +}