From af97d73cdc2a36aed4b7aedde06b48fcdd9bbc86 Mon Sep 17 00:00:00 2001 From: "Alan T. DeKok" Date: Wed, 20 Apr 2022 16:30:56 -0400 Subject: [PATCH] use marker instead of entire dbuff --- src/lib/util/struct.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/lib/util/struct.c b/src/lib/util/struct.c index a7844e80857..51db7e7ea06 100644 --- a/src/lib/util/struct.c +++ b/src/lib/util/struct.c @@ -461,7 +461,7 @@ ssize_t fr_struct_to_network(fr_dbuff_t *dbuff, fr_encode_dbuff_t encode_value, fr_encode_dbuff_t encode_tlv) { fr_dbuff_t work_dbuff = FR_DBUFF(dbuff); - fr_dbuff_t hdr_dbuff = FR_DBUFF(dbuff); + fr_dbuff_marker_t hdr; int offset = 0; unsigned int child_num = 1; bool do_length = false; @@ -529,6 +529,8 @@ ssize_t fr_struct_to_network(fr_dbuff_t *dbuff, * Some structs are prefixed by a 16-bit length. */ if (da_is_length_field(parent)) { + fr_dbuff_marker(&hdr, &work_dbuff); + if (parent->flags.subtype == FLAG_LENGTH_UINT8) { FR_DBUFF_ADVANCE_RETURN(&work_dbuff, 1); } else { @@ -801,15 +803,17 @@ done: len = fr_dbuff_used(&work_dbuff) - need; if (len > max) { + fr_dbuff_marker_release(&hdr); fr_strerror_const("Structure size is too large for 16-bit length field."); return -1; } if (need == 1) { - fr_dbuff_in(&hdr_dbuff, (uint8_t)len); + fr_dbuff_in(&hdr, (uint8_t)len); } else { - fr_dbuff_in(&hdr_dbuff, (uint16_t)len); + fr_dbuff_in(&hdr, (uint16_t)len); } + fr_dbuff_marker_release(&hdr); } /* -- 2.47.3