tmpl_rules_t const *t_rules)
{
tmpl_t *vpt;
- char *str;
fr_sbuff_parse_error_t sberr;
fr_sbuff_t our_in = FR_SBUFF(in);
+ fr_sbuff_t *enum_buff;
+
+ FR_SBUFF_TALLOC_THREAD_LOCAL(&enum_buff, 1024, SIZE_MAX);
/*
* If there isn't a "::" prefix, then check for migration flags, and enum.
return 0;
}
+ /*
+ * Need to store the value with the prefix, because the value box functions
+ * expect it to be there...
+ */
+ fr_sbuff_in_strcpy_literal(enum_buff, "::");
+
vpt = tmpl_alloc_null(ctx);
/*
* Note that we don't actually try to resolve the enum name. The caller is responsible
* for doing that.
*/
- if (fr_dict_enum_name_afrom_substr(vpt, &str, &sberr, &our_in, p_rules ? p_rules->terminals : NULL) < 0) {
+ if (fr_dict_enum_name_from_substr(enum_buff, &sberr, &our_in, p_rules ? p_rules->terminals : NULL) < 0) {
/*
* Produce our own errors which make
* more sense in the context of tmpls
if (t_rules->enumv) {
fr_dict_enum_value_t const *dv;
- dv = fr_dict_enum_by_name(t_rules->enumv, str, -1);
+ dv = fr_dict_enum_by_name(t_rules->enumv, fr_sbuff_start(enum_buff), fr_sbuff_used(enum_buff));
if (dv) {
tmpl_init(vpt, TMPL_TYPE_DATA, T_BARE_WORD,
fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
tmpl_init(vpt, TMPL_TYPE_DATA_UNRESOLVED, T_BARE_WORD,
fr_sbuff_start(&our_in), fr_sbuff_used(&our_in), t_rules);
- vpt->data.unescaped = str;
+ MEM(vpt->data.unescaped = talloc_bstrndup(vpt, fr_sbuff_start(enum_buff), fr_sbuff_used(enum_buff)));
*out = vpt;
FR_SBUFF_SET_RETURN(in, &our_in);