Skip to content

Commit ea7e8be

Browse files
committed
various bug fixes in dhcpv6 processor.
* don't free rctx, the framework will clean it up when the stack frame pops. And the rctx ptr is cached in mctx->rctx, so freeing it will cause errors * hoist "allocate sbuff" outside of loop
1 parent a268465 commit ea7e8be

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

src/process/dhcpv6/base.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ int dhcpv6_client_fields_store(request_t *request, process_dhcpv6_rctx_t *rctx,
344344
return -1;
345345
}
346346

347-
rctx->transaction_id = fr_pair_copy(rctx, transaction_id);
347+
MEM(rctx->transaction_id = fr_pair_copy(rctx, transaction_id));
348348

349349
fr_pair_list_init(&rctx->client_id);
350350
fr_pair_list_init(&rctx->server_id);
@@ -357,13 +357,11 @@ int dhcpv6_client_fields_store(request_t *request, process_dhcpv6_rctx_t *rctx,
357357
&request->request_pairs, attr_client_id)) {
358358
case -1:
359359
REDEBUG("Error copying Client-ID");
360-
error:
361-
talloc_free(rctx);
362360
return -1;
363361

364362
case 0:
365363
REDEBUG("Missing Client-ID");
366-
goto error;
364+
return -1;
367365

368366
default:
369367
break;
@@ -373,19 +371,19 @@ int dhcpv6_client_fields_store(request_t *request, process_dhcpv6_rctx_t *rctx,
373371
&request->request_pairs, attr_server_id)) {
374372
case -1:
375373
REDEBUG("Error copying Server-ID");
376-
goto error;
374+
return -1;
377375

378376
case 0:
379377
if (expect_server_id) {
380378
REDEBUG("Missing Server-ID");
381-
goto error;
379+
return -1;
382380
}
383381
break;
384382

385383
default:
386384
if (!expect_server_id) {
387385
REDEBUG("Server-ID should not be present");
388-
goto error;
386+
return -1;
389387
}
390388
break;
391389
}
@@ -558,14 +556,14 @@ void status_code_add(process_dhcpv6_t const *inst, request_t *request, fr_value_
558556
fr_sbuff_uctx_talloc_t tctx;
559557
fr_sbuff_t sbuff;
560558

561-
do {
562-
/*
563-
* Create an aggregation buffer up to
564-
* the maximum length of a status
565-
* message.
566-
*/
567-
fr_sbuff_init_talloc(vp, &sbuff, &tctx, 1024, UINT16_MAX - 2);
559+
/*
560+
* Create an aggregation buffer up to
561+
* the maximum length of a status
562+
* message.
563+
*/
564+
fr_sbuff_init_talloc(vp, &sbuff, &tctx, 1024, UINT16_MAX - 2);
568565

566+
do {
569567
/*
570568
* Best effort... it's probably OK
571569
* if we truncate really long messages.
@@ -575,6 +573,7 @@ void status_code_add(process_dhcpv6_t const *inst, request_t *request, fr_value_
575573
} while ((failure_message = fr_pair_find_by_da(&request->request_pairs, failure_message,
576574
attr_module_failure_message)) &&
577575
(fr_sbuff_in_strcpy_literal(&sbuff, ". ") == 2));
576+
578577
fr_sbuff_trim_talloc(&sbuff, SIZE_MAX); /* Fix size */
579578
fr_pair_value_bstrndup_shallow(vp, fr_sbuff_start(&sbuff), fr_sbuff_used(&sbuff), false);
580579
}

0 commit comments

Comments
 (0)