{
xlat_t *c;
module_inst_ctx_t *our_mctx = NULL;
+ size_t len, used;
+ fr_sbuff_t in;
char inst_name[256];
fr_assert(xlat_root);
name = inst_name;
}
+ len = strlen(name);
+ in = FR_SBUFF_IN(name, len);
+ fr_sbuff_adv_past_allowed(&in, SIZE_MAX, xlat_func_chars, NULL);
+ used = fr_sbuff_used(&in);
+
+ if (used < len) {
+ ERROR("%s: Invalid character '%c' in dynamic expansion name '%s'", __FUNCTION__, name[used], name);
+ return NULL;
+ }
+
/*
* If it already exists, replace the instance.
*/
extern fr_dict_attr_t const *attr_module_return_code;
extern fr_dict_attr_t const *attr_cast_base;
+/*
+ * xlat_tokenize.c
+ */
+extern bool const xlat_func_chars[UINT8_MAX + 1];
+
void xlat_signal(xlat_func_signal_t signal, xlat_exp_t const *exp,
request_t *request, void *rctx, fr_signal_t action);
return 0;
}
-static bool const func_chars[UINT8_MAX + 1] = {
+bool const xlat_func_chars[UINT8_MAX + 1] = {
SBUFF_CHAR_CLASS_ALPHA_NUM,
['.'] = true, ['-'] = true, ['_'] = true,
};
* %{module:args}
*/
fr_sbuff_marker(&m_s, in);
- fr_sbuff_adv_past_allowed(in, SIZE_MAX, func_chars, NULL);
+ fr_sbuff_adv_past_allowed(in, SIZE_MAX, xlat_func_chars, NULL);
if (!fr_sbuff_is_char(in, ':')) {
fr_strerror_const("Can't find function/argument separator");
* %(module:args)
*/
fr_sbuff_marker(&m_s, in);
- fr_sbuff_adv_past_allowed(in, SIZE_MAX, func_chars, NULL);
+ fr_sbuff_adv_past_allowed(in, SIZE_MAX, xlat_func_chars, NULL);
if (!fr_sbuff_is_char(in, ':')) {
fr_strerror_const("Can't find function/argument separator");
fr_sbuff_marker_t m_s;
fr_sbuff_marker(&m_s, in);
- fr_sbuff_adv_past_allowed(in, SIZE_MAX, func_chars, NULL);
+ fr_sbuff_adv_past_allowed(in, SIZE_MAX, xlat_func_chars, NULL);
/*
* Special-case: %% is just %