From: Alan T. DeKok Date: Tue, 30 Aug 2022 16:47:19 +0000 (-0400) Subject: forbid [*] and [#] on the LHS of edit assignments X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c650333a405677babcda6e2ead27b467a5af5ca7;p=thirdparty%2Ffreeradius-server.git forbid [*] and [#] on the LHS of edit assignments and update the scripts in all.mk to handle [*] in output --- diff --git a/src/lib/unlang/compile.c b/src/lib/unlang/compile.c index 9b73b95ca91..dbc13d3a42a 100644 --- a/src/lib/unlang/compile.c +++ b/src/lib/unlang/compile.c @@ -1464,6 +1464,7 @@ static unlang_t *compile_edit_section(unlang_t *parent, unlang_compile_t *unlang fr_token_t op; ssize_t slen; fr_dict_attr_t const *parent_da; + int num; tmpl_rules_t t_rules; @@ -1551,6 +1552,15 @@ static unlang_t *compile_edit_section(unlang_t *parent, unlang_compile_t *unlang } } + /* + * Can't assign to [*] or [#] + */ + num = tmpl_num(map->lhs); + if ((num == NUM_ALL) || (num == NUM_COUNT)) { + cf_log_err(cs, "Invalid array reference in %s", name); + goto fail; + } + /* * Do basic sanity checks and resolving. */ @@ -1578,6 +1588,7 @@ static unlang_t *compile_edit_pair(unlang_t *parent, unlang_compile_t *unlang_ct unlang_edit_t *edit, *edit_free; unlang_t *c = NULL, *out = UNLANG_IGNORE; map_t *map; + int num; tmpl_rules_t t_rules; fr_token_t op; @@ -1633,6 +1644,15 @@ static unlang_t *compile_edit_pair(unlang_t *parent, unlang_compile_t *unlang_ct return NULL; } + /* + * Can't assign to [*] or [#] + */ + num = tmpl_num(map->lhs); + if ((num == NUM_ALL) || (num == NUM_COUNT)) { + cf_log_err(cp, "Invalid array reference in %s", map->lhs->name); + goto fail; + } + /* * Do basic sanity checks and resolving. */ diff --git a/src/tests/keywords/all.mk b/src/tests/keywords/all.mk index 5074ddf988d..10303f3684d 100644 --- a/src/tests/keywords/all.mk +++ b/src/tests/keywords/all.mk @@ -117,7 +117,7 @@ $(OUTPUT)/%: $(DIR)/% $(TEST_BIN_DIR)/unit_test_module | $(KEYWORD_RADDB) $(KEYW rm -f $(BUILD_DIR)/tests/test.keywords; \ exit 1; \ fi; \ - FOUND=$$(grep -E '^(Error : )?src/tests/keywords/$(notdir $@)' $@.log | head -1 | sed 's/.*\[//;s/\].*//'); \ + FOUND=$$(grep 'Error : src/tests/keywords/' $@.log | head -1 | sed 's/]:.*//;s/.*\[//;s/\].*//'); \ EXPECTED=$$(grep -n ERROR $< | sed 's/:.*//'); \ if [ "$$EXPECTED" != "$$FOUND" ]; then \ cat $@.log; \ diff --git a/src/tests/keywords/assign_error b/src/tests/keywords/assign-empty-rhs-error similarity index 100% rename from src/tests/keywords/assign_error rename to src/tests/keywords/assign-empty-rhs-error diff --git a/src/tests/keywords/assign-star-error b/src/tests/keywords/assign-star-error new file mode 100644 index 00000000000..3b0138d5d35 --- /dev/null +++ b/src/tests/keywords/assign-star-error @@ -0,0 +1,4 @@ +# +# We might allow this later. But for now, the code doesn't implement it, so we don't allow it. +# +&User-Name[*] = "foo" # ERROR diff --git a/src/tests/keywords/join b/src/tests/keywords/join index a123d116dbf..26bc129d297 100644 --- a/src/tests/keywords/join +++ b/src/tests/keywords/join @@ -1,5 +1,5 @@ # -# PRE: update if concat +# PRE: if concat # &request -= &Packet-Type[*] diff --git a/src/tests/keywords/xlat-alternation b/src/tests/keywords/xlat-alternation index 25e00a01110..845f9403bfc 100644 --- a/src/tests/keywords/xlat-alternation +++ b/src/tests/keywords/xlat-alternation @@ -1,19 +1,14 @@ # -# PRE: update +# PRE: # -update request { - &Tmp-String-0 := "foo" - &Tmp-String-1 := "bar" -} +&Tmp-String-0 := "foo" +&Tmp-String-1 := "bar" # # First choice # -update request { - &Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" -} - +&Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" if (&Tmp-String-2[0] != 'foo') { fail } @@ -21,12 +16,8 @@ if (&Tmp-String-2[0] != 'foo') { # # Second choice # -update request { - &Tmp-String-0 !* ANY -} -update request { - &Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" -} +&request -= &Tmp-String-0[*] +&Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" if (&Tmp-String-2[0] != 'bar') { fail } @@ -34,9 +25,7 @@ if (&Tmp-String-2[0] != 'bar') { # # Multiple things in an alternation # -update request { - &Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]} foo}" -} +&Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]} foo}" if (&Tmp-String-2[0] != 'bar foo') { fail } @@ -44,12 +33,8 @@ if (&Tmp-String-2[0] != 'bar foo') { # # Everything null # -update request { - &Tmp-String-1 !* ANY -} -update request { - &Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" -} +&request -= &Tmp-String-1[*] +&Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}" if (!&Tmp-String-2[0] || (&Tmp-String-2[0] != "")) { fail } diff --git a/src/tests/keywords/xlat-alternation-fail-then-func b/src/tests/keywords/xlat-alternation-fail-then-func index f4b1dc98b91..9cb92150615 100644 --- a/src/tests/keywords/xlat-alternation-fail-then-func +++ b/src/tests/keywords/xlat-alternation-fail-then-func @@ -1,16 +1,9 @@ -# -# PRE: update -# - # # Everything null # -update request { - &Tmp-String-0 !* ANY - &Tmp-String-1 !* ANY -} -update request { - &Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}%(delay_10s:)" -} +&request -= &Tmp-String-0[*] +&request -= &Tmp-String-1[*] + +&Tmp-String-2 := "%{%{Tmp-String-0[0]}:-%{Tmp-String-1[0]}}%(delay_10s:)" success diff --git a/src/tests/keywords/xlat-attr-index b/src/tests/keywords/xlat-attr-index index 039f465663e..c2cb4263694 100644 --- a/src/tests/keywords/xlat-attr-index +++ b/src/tests/keywords/xlat-attr-index @@ -1,17 +1,12 @@ -# -# PRE: update -# - -update request { - &Tmp-IP-Address-0 := 192.0.2.1 - &Tmp-IP-Address-0 += 192.0.2.2 +&request += { + &Tmp-IP-Address-0 = 192.0.2.1 + &Tmp-IP-Address-0 = 192.0.2.2 } - if ("%{Tmp-IP-Address-0[#]}" != 2) { test_fail } -if (("%{Tmp-IP-Address-0[0]}" != 192.0.2.1) || ("%{Tmp-IP-Address-0[1]}" != 192.0.2.2)) { +if ((&Tmp-IP-Address-0[0] != 192.0.2.1) || ("%{Tmp-IP-Address-0[1]}" != 192.0.2.2)) { test_fail }