@@ -783,6 +783,9 @@ bool xlat_process_return(request_t *request, xlat_t const *func, fr_value_box_li
783783
784784 /* We are not forgiving for debug builds */
785785 fr_assert_fail ("Treating invalid return type as fatal" );
786+ #ifdef NDEBUG
787+ return false;
788+ #endif
786789 }
787790 fr_value_box_mark_safe_for (pos , func -> return_safe_for ); /* Always set this */
788791 count ++ ;
@@ -817,10 +820,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
817820 switch (letter ) {
818821 case '%' :
819822 MEM (value = fr_value_box_alloc_null (ctx ));
820- if (fr_value_box_strdup (value , value , NULL , "%" , false) < 0 ) {
821- talloc_free (value );
822- return XLAT_ACTION_FAIL ;
823- }
823+ MEM (fr_value_box_strdup (value , value , NULL , "%" , false) >= 0 );
824824 break ;
825825
826826 /*
@@ -884,10 +884,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
884884 strftime (buffer , sizeof (buffer ), "%Y%m%d" , & ts );
885885
886886 MEM (value = fr_value_box_alloc_null (ctx ));
887- if (fr_value_box_strdup (value , value , NULL , buffer , false) < 0 ) {
888- talloc_free (value );
889- goto error ;
890- }
887+ MEM (fr_value_box_strdup (value , value , NULL , buffer , false) >= 0 );
891888 break ;
892889
893890 case 'e' : /* Request second */
@@ -917,7 +914,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
917914 * seconds?
918915 */
919916 MEM (value = fr_value_box_alloc (ctx , FR_TYPE_UINT64 , NULL ));
920- value -> datum .uint64 = (uint64_t ) now ;
917+ value -> datum .uint64 = (uint64_t ) now ;
921918 break ;
922919
923920 case 'm' : /* Request month */
@@ -941,7 +938,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
941938 strftime (buffer , sizeof (buffer ), "%Y-%m-%d %H:%M:%S" , & ts );
942939
943940 MEM (value = fr_value_box_alloc_null (ctx ));
944- if (fr_value_box_strdup (value , value , NULL , buffer , false) < 0 ) goto error ;
941+ MEM (fr_value_box_strdup (value , value , NULL , buffer , false) >= 0 );
945942 break ;
946943
947944 case 't' : /* Request timestamp in CTIME format */
@@ -953,7 +950,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
953950 if (p ) * p = '\0' ;
954951
955952 MEM (value = fr_value_box_alloc_null (ctx ));
956- if (fr_value_box_strdup (value , value , NULL , buffer , false) < 0 ) goto error ;
953+ MEM (fr_value_box_strdup (value , value , NULL , buffer , false) >= 0 );
957954 }
958955 break ;
959956
@@ -973,7 +970,7 @@ xlat_action_t xlat_eval_one_letter(TALLOC_CTX *ctx, fr_value_box_list_t *out,
973970 (int ) fr_time_to_msec (request -> packet -> timestamp ) % 1000 );
974971
975972 MEM (value = fr_value_box_alloc_null (ctx ));
976- if (fr_value_box_strdup (value , value , NULL , buffer , false) < 0 ) goto error ;
973+ MEM (fr_value_box_strdup (value , value , NULL , buffer , false) >= 0 );
977974 }
978975 break ;
979976
@@ -1275,7 +1272,7 @@ xlat_action_t xlat_frame_eval_repeat(TALLOC_CTX *ctx, fr_dcursor_t *out,
12751272 if ((node -> quote != T_BARE_WORD ) && !head -> is_argv ) {
12761273 if (!fr_value_box_list_head (result )) {
12771274 MEM (arg = fr_value_box_alloc (ctx , FR_TYPE_STRING , NULL ));
1278- fr_value_box_strdup (arg , arg , NULL , "" , false);
1275+ MEM ( fr_value_box_strdup (arg , arg , NULL , "" , false) >= 0 );
12791276 fr_dcursor_insert (out , arg );
12801277 break ;
12811278 }
@@ -1371,7 +1368,7 @@ xlat_action_t xlat_frame_eval(TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_exp_head_
13711368 xlat_action_t xa = XLAT_ACTION_DONE ;
13721369 xlat_exp_t const * node ;
13731370 fr_value_box_list_t result ; /* tmp list so debug works correctly */
1374- fr_value_box_t * value ;
1371+ fr_value_box_t * value = NULL ;
13751372
13761373 fr_value_box_list_init (& result );
13771374
@@ -1438,7 +1435,7 @@ xlat_action_t xlat_frame_eval(TALLOC_CTX *ctx, fr_dcursor_t *out, xlat_exp_head_
14381435 * because references aren't threadsafe.
14391436 */
14401437 MEM (value = fr_value_box_alloc_null (ctx ));
1441- if ( unlikely ( fr_value_box_copy (value , value , & node -> data ) < 0 )) goto fail ;
1438+ MEM ( fr_value_box_copy (value , value , & node -> data ) >= 0 );
14421439 fr_dcursor_append (out , value );
14431440 continue ;
14441441
@@ -1785,6 +1782,7 @@ static ssize_t _xlat_eval_compiled(TALLOC_CTX *ctx, char **out, size_t outlen, r
17851782 }
17861783
17871784 if ((size_t )slen >= outlen ) {
1785+ talloc_free (buff );
17881786 fr_strerror_const ("Insufficient output buffer space" );
17891787 return -1 ;
17901788 }
0 commit comments