Skip to content

Commit f52028a

Browse files
committed
use MEM in more places, and free buffers on error
1 parent c855f26 commit f52028a

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

src/lib/unlang/xlat_eval.c

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)