@@ -220,9 +220,9 @@ static int xlat_validate_function_arg(xlat_arg_parser_t const *arg_p, xlat_exp_t
220220 fr_assert (tmpl_rules_cast (vpt ) == FR_TYPE_NULL );
221221
222222 fr_value_box_steal (node , & node -> data , tmpl_value (vpt ));
223-
224223 talloc_free (vpt );
225224 xlat_exp_set_type (node , XLAT_BOX );
225+ fr_value_box_mark_safe_for (& node -> data , arg_p -> safe_for );
226226
227227 } else {
228228 fr_assert (!tmpl_is_data_unresolved (node -> vpt ));
@@ -310,7 +310,7 @@ fr_slen_t xlat_validate_function_args(xlat_exp_t *node)
310310 * - 0 if the string was parsed into a function.
311311 * - <0 on parse error.
312312 */
313- static int xlat_tokenize_function_args (xlat_exp_head_t * head , fr_sbuff_t * in , tmpl_rules_t const * t_rules )
313+ static CC_HINT ( nonnull ) int xlat_tokenize_function_args (xlat_exp_head_t * head , fr_sbuff_t * in , tmpl_rules_t const * t_rules )
314314{
315315 char c ;
316316 xlat_exp_t * node ;
@@ -824,15 +824,12 @@ int xlat_tokenize_expansion(xlat_exp_head_t *head, fr_sbuff_t *in,
824824 * @param[in] in sbuff to parse.
825825 * @param[in] p_rules that control parsing.
826826 * @param[in] t_rules that control attribute reference and xlat function parsing.
827- * @param[in] safe_for mark up literal values as being pre-escaped. May be merged
828- * with t_rules in future.
829827 * @return
830828 * - <0 on failure
831829 * - >=0 for number of bytes parsed
832830 */
833- static ssize_t xlat_tokenize_input (xlat_exp_head_t * head , fr_sbuff_t * in ,
834- fr_sbuff_parse_rules_t const * p_rules , tmpl_rules_t const * t_rules ,
835- fr_value_box_safe_for_t safe_for )
831+ static CC_HINT (nonnull (1 ,2 ,4 )) ssize_t xlat_tokenize_input (xlat_exp_head_t * head , fr_sbuff_t * in ,
832+ fr_sbuff_parse_rules_t const * p_rules , tmpl_rules_t const * t_rules )
836833{
837834 xlat_exp_t * node = NULL;
838835 fr_slen_t slen ;
@@ -883,7 +880,7 @@ static ssize_t xlat_tokenize_input(xlat_exp_head_t *head, fr_sbuff_t *in,
883880 do_value_box :
884881 xlat_exp_set_name_buffer_shallow (node , str );
885882 fr_value_box_strdup (node , & node -> data , NULL , str , false);
886- fr_value_box_mark_safe_for (& node -> data , safe_for );
883+ fr_value_box_mark_safe_for (& node -> data , t_rules -> literals_safe_for );
887884 node -> flags .constant = true;
888885 fr_assert (node -> flags .pure );
889886
@@ -1348,6 +1345,35 @@ ssize_t xlat_print(fr_sbuff_t *out, xlat_exp_head_t const *head, fr_sbuff_escape
13481345 return fr_sbuff_used_total (out ) - at_in ;
13491346}
13501347
1348+ #if 0
1349+ static void xlat_safe_for (xlat_exp_head_t * head , fr_value_box_safe_for_t safe_for )
1350+ {
1351+ xlat_exp_foreach (head , node ) {
1352+ switch (node -> type ) {
1353+ case XLAT_BOX :
1354+ if (node -> data .safe_for != safe_for ) {
1355+ ERROR ("FAILED %lx %lx - %s" , node -> data .safe_for , safe_for , node -> fmt );
1356+ }
1357+ fr_assert (node -> data .safe_for == safe_for );
1358+ break ;
1359+
1360+ case XLAT_GROUP :
1361+ xlat_safe_for (node -> group , safe_for );
1362+ break ;
1363+
1364+ case XLAT_TMPL :
1365+ if (!tmpl_is_xlat (node -> vpt )) break ;
1366+
1367+ xlat_safe_for (tmpl_xlat (node -> vpt ), safe_for );
1368+ break ;
1369+
1370+ default :
1371+ break ;
1372+ }
1373+ }
1374+ }
1375+ #endif
1376+
13511377
13521378/** Tokenize an xlat expansion into a series of XLAT_TYPE_CHILD arguments
13531379 *
@@ -1378,8 +1404,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
13781404 fr_sbuff_parse_rules_t tmp_p_rules ;
13791405 xlat_exp_head_t * head ;
13801406 xlat_arg_parser_t const * arg = NULL , * arg_start ;
1381- tmpl_rules_t const * our_t_rules = t_rules ;
1382- tmpl_rules_t tmp_t_rules ;
1407+ tmpl_rules_t arg_t_rules ;
13831408
13841409 if (xlat && xlat -> args ) {
13851410 arg_start = arg = xlat -> args ; /* Track the arguments as we parse */
@@ -1388,6 +1413,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
13881413 XLAT_ARG_PARSER_TERMINATOR };
13891414 arg_start = arg = & default_arg [0 ];
13901415 }
1416+ arg_t_rules = * t_rules ;
13911417
13921418 if (spaces ) {
13931419 fr_assert (p_rules != & xlat_function_arg_rules );
@@ -1421,15 +1447,12 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
14211447 * expression to be just about anything.
14221448 */
14231449 if (!xlat_func_bare_words ) {
1424- tmp_t_rules = * t_rules ;
1425- our_t_rules = & tmp_t_rules ;
1426-
1427- tmp_t_rules .enumv = NULL ;
1428- tmp_t_rules .cast = FR_TYPE_NULL ;
1429- tmp_t_rules .attr .namespace = NULL ;
1430- tmp_t_rules .attr .request_def = NULL ;
1431- tmp_t_rules .attr .list_def = request_attr_request ;
1432- tmp_t_rules .attr .list_presence = TMPL_ATTR_LIST_ALLOW ;
1450+ arg_t_rules .enumv = NULL ;
1451+ arg_t_rules .cast = FR_TYPE_NULL ;
1452+ arg_t_rules .attr .namespace = NULL ;
1453+ arg_t_rules .attr .request_def = NULL ;
1454+ arg_t_rules .attr .list_def = request_attr_request ;
1455+ arg_t_rules .attr .list_presence = TMPL_ATTR_LIST_ALLOW ;
14331456 }
14341457 }
14351458
@@ -1449,6 +1472,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
14491472 size_t len ;
14501473
14511474 fr_sbuff_set (& m , & our_in ); /* Record start of argument */
1475+ arg_t_rules .literals_safe_for = arg -> safe_for ;
14521476
14531477 /*
14541478 * Whitespace isn't significant for comma-separated argvs
@@ -1497,7 +1521,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
14971521 *
14981522 * No spaces - each arugment is an expression, which can have embedded spaces.
14991523 */
1500- slen = xlat_tokenize_input (node -> group , & our_in , our_p_rules , t_rules , arg -> safe_for );
1524+ slen = xlat_tokenize_input (node -> group , & our_in , our_p_rules , & arg_t_rules );
15011525
15021526 } else {
15031527 tokenize_expression :
@@ -1508,7 +1532,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
15081532 slen = 0 ;
15091533
15101534 } else {
1511- slen = xlat_tokenize_expression (node , & node -> group , & our_in , our_p_rules , our_t_rules );
1535+ slen = xlat_tokenize_expression (node , & node -> group , & our_in , our_p_rules , & arg_t_rules );
15121536 }
15131537 }
15141538 if (slen < 0 ) {
@@ -1551,7 +1575,7 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
15511575 XLAT_DEBUG ("ARGV double quotes <-- %.*s" , (int ) fr_sbuff_remaining (& our_in ), fr_sbuff_current (& our_in ));
15521576
15531577 if (xlat_tokenize_input (node -> group , & our_in ,
1554- & value_parse_rules_double_quoted , t_rules , arg -> safe_for ) < 0 ) goto error ;
1578+ & value_parse_rules_double_quoted , & arg_t_rules ) < 0 ) goto error ;
15551579 break ;
15561580
15571581 /*
@@ -1600,6 +1624,13 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
16001624 fmt = talloc_bstrndup (node , fr_sbuff_current (& m ), fr_sbuff_behind (& m ));
16011625 xlat_exp_set_name_buffer_shallow (node , fmt );
16021626
1627+ /*
1628+ * Assert that the parser has created things which are safe for the current argument.
1629+ *
1630+ * @todo - function should be marked up with safe_for, and not each individual argument.
1631+ */
1632+ // xlat_safe_for(node->group, arg->safe_for);
1633+
16031634 node -> flags = node -> group -> flags ;
16041635
16051636 xlat_exp_insert_tail (head , node );
@@ -1682,20 +1713,14 @@ fr_slen_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t
16821713 * @param[in] p_rules controlling how the string containing the xlat
16831714 * expansions should be parsed.
16841715 * @param[in] t_rules controlling how attribute references are parsed.
1685- * Do NOT alter this function to take tmpl_rules_t
1686- * as this provides another value for literals_safe_for
1687- * and this gets very confusing.
1688- * @param[in] literals_safe_for the safe_for value to assign to any literals occurring at the
1689- * top level of the expansion.
16901716 * @return
16911717 * - >0 on success.
16921718 * - 0 and *head == NULL - Parse failure on first char.
16931719 * - 0 and *head != NULL - Zero length expansion
16941720 * - < 0 the negative offset of the parse failure.
16951721 */
16961722fr_slen_t xlat_tokenize (TALLOC_CTX * ctx , xlat_exp_head_t * * out , fr_sbuff_t * in ,
1697- fr_sbuff_parse_rules_t const * p_rules , tmpl_rules_t const * t_rules ,
1698- fr_value_box_safe_for_t literals_safe_for )
1723+ fr_sbuff_parse_rules_t const * p_rules , tmpl_rules_t const * t_rules )
16991724{
17001725 fr_sbuff_t our_in = FR_SBUFF (in );
17011726 xlat_exp_head_t * head ;
@@ -1704,7 +1729,7 @@ fr_slen_t xlat_tokenize(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t *in,
17041729 MEM (head = xlat_exp_head_alloc (ctx ));
17051730 fr_strerror_clear (); /* Clear error buffer */
17061731
1707- if (xlat_tokenize_input (head , & our_in , p_rules , t_rules , literals_safe_for ) < 0 ) {
1732+ if (xlat_tokenize_input (head , & our_in , p_rules , t_rules ) < 0 ) {
17081733 talloc_free (head );
17091734 FR_SBUFF_ERROR_RETURN (& our_in );
17101735 }
0 commit comments