From: Alan T. DeKok Date: Mon, 2 Sep 2024 13:03:11 +0000 (-0400) Subject: update tokenizer for tmpl_require_enum_prefix X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bc75dba9439f56430ca65dd4d948fd8c021cfbaa;p=thirdparty%2Ffreeradius-server.git update tokenizer for tmpl_require_enum_prefix it still has issues parsing (byte)Class because it tries to parse "Class" as data type "byte" --- diff --git a/src/lib/server/tmpl_tokenize.c b/src/lib/server/tmpl_tokenize.c index 4c16db456fb..f4f79c444a3 100644 --- a/src/lib/server/tmpl_tokenize.c +++ b/src/lib/server/tmpl_tokenize.c @@ -2237,12 +2237,21 @@ ssize_t tmpl_afrom_attr_substr(TALLOC_CTX *ctx, tmpl_attr_error_t *err, */ switch (at_rules->prefix) { case TMPL_ATTR_REF_PREFIX_YES: - if (!fr_sbuff_next_if_char(&our_name, '&')) { - fr_strerror_const("Invalid attribute reference, missing '&' prefix"); - if (err) *err = TMPL_ATTR_ERROR_BAD_PREFIX; - FR_SBUFF_ERROR_RETURN(&our_name); + if (!tmpl_require_enum_prefix) { + if (!fr_sbuff_next_if_char(&our_name, '&')) { + fr_strerror_const("Invalid attribute reference, missing '&' prefix"); + if (err) *err = TMPL_ATTR_ERROR_BAD_PREFIX; + FR_SBUFF_ERROR_RETURN(&our_name); + } + break; } + FALL_THROUGH; /* if we do require enum prefixes, then the '&' is optional */ + case TMPL_ATTR_REF_PREFIX_AUTO: + /* + * '&' prefix can be there, but doesn't have to be + */ + (void) fr_sbuff_next_if_char(&our_name, '&'); break; case TMPL_ATTR_REF_PREFIX_NO: @@ -2252,13 +2261,6 @@ ssize_t tmpl_afrom_attr_substr(TALLOC_CTX *ctx, tmpl_attr_error_t *err, FR_SBUFF_ERROR_RETURN(&our_name); } break; - - case TMPL_ATTR_REF_PREFIX_AUTO: - /* - * '&' prefix can be there, but doesn't have to be - */ - (void) fr_sbuff_next_if_char(&our_name, '&'); - break; } MEM(vpt = tmpl_alloc(ctx, TMPL_TYPE_ATTR, T_BARE_WORD, NULL, 0)); @@ -5559,7 +5561,12 @@ ssize_t tmpl_preparse(char const **out, size_t *outlen, char const *in, size_t i default: bare_word: *out = p; - quote = '\0'; + + if (tmpl_require_enum_prefix) { + quote = '['; /* foo[1] is OK */ + } else { + quote = '\0'; + } skip_word: *type = T_BARE_WORD; diff --git a/src/tests/keywords/all.mk b/src/tests/keywords/all.mk index 5d685e98012..21371cc3a2f 100644 --- a/src/tests/keywords/all.mk +++ b/src/tests/keywords/all.mk @@ -151,6 +151,8 @@ KEYWORD_LIBS := $(addsuffix .la,$(addprefix rlm_,$(KEYWORD_MODULES))) rlm_csv.la # # (make -k test.keywords 2>&1) | grep 'KEYWORD=' | sed 's/KEYWORD=//;s/ .*$//' # +# @todo - set "-S require_enum_prefix=yes" here, so that the flag is set _before_ we read the config files. +# $(OUTPUT)/%: $(DIR)/% $(TEST_BIN_DIR)/unit_test_module | $(KEYWORD_RADDB) $(KEYWORD_LIBS) build.raddb rlm_test.la rlm_csv.la rlm_unpack.la $(eval CMD:=KEYWORD=$(notdir $@) $(TEST_BIN)/unit_test_module $(NEW_COND) $(UNIT_TEST_KEYWORD_ARGS.$(subst -,_,$(notdir $@))) -D share/dictionary -d src/tests/keywords/ -i "$@.attrs" -f "$@.attrs" -r "$@" -xx) @echo "KEYWORD-TEST $(notdir $@)" diff --git a/src/tests/keywords/vendor-specific-error b/src/tests/keywords/vendor-specific-error deleted file mode 100644 index 0f853e0f463..00000000000 --- a/src/tests/keywords/vendor-specific-error +++ /dev/null @@ -1,8 +0,0 @@ -# -# PRE: update -# -# Tests for Vendor-Specific -# -update reply { - Vendor-Specific := "foo" # ERROR -}