From: Alan T. DeKok Date: Wed, 11 Mar 2026 22:25:17 +0000 (-0400) Subject: only call marker() functions once. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=672252283b3fd4076a4f48cd6adeb4fad5b221a4;p=thirdparty%2Ffreeradius-server.git only call marker() functions once. one the second pass, call set() --- diff --git a/src/protocols/der/decode.c b/src/protocols/der/decode.c index 57a977ff259..32c3d51347b 100644 --- a/src/protocols/der/decode.c +++ b/src/protocols/der/decode.c @@ -924,6 +924,8 @@ static ssize_t fr_der_decode_set(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_a } if (flags->is_set_of) { + fr_dbuff_marker_t current_value_marker; + /* * There should only be one child in a "set_of". We can't check this when we load * the dictionaries, because there is no "finalize" callback. @@ -939,8 +941,9 @@ static ssize_t fr_der_decode_set(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_a return -1; } + fr_dbuff_marker(¤t_value_marker, &our_in); + while (fr_dbuff_remaining(&our_in) > 0) { - fr_dbuff_marker_t current_value_marker; ssize_t ret; uint8_t current_tag; uint8_t *current_marker = fr_dbuff_current(&our_in); @@ -956,7 +959,7 @@ static ssize_t fr_der_decode_set(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_a return ret; } - fr_dbuff_marker(¤t_value_marker, &our_in); + fr_dbuff_set(¤t_value_marker, &our_in); /* * Ensure that the contents of the tags are sorted. diff --git a/src/protocols/der/encode.c b/src/protocols/der/encode.c index 5bdf9dab3a6..f7fb14aac1f 100644 --- a/src/protocols/der/encode.c +++ b/src/protocols/der/encode.c @@ -1121,6 +1121,7 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu ssize_t slen = 0; size_t is_critical = 0; uint64_t max, num; + fr_dbuff_marker_t length_start, inner_seq_len_start; vp = fr_dcursor_current(cursor); PAIR_VERIFY(vp); @@ -1172,10 +1173,12 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu fr_pair_dcursor_child_iter_init(&root_cursor, &vp->children, cursor); fr_dcursor_copy(&parent_cursor, &root_cursor); + fr_dbuff_marker(&inner_seq_len_start, &our_dbuff); + fr_dbuff_marker(&length_start, &our_dbuff); + while (fr_dcursor_current(&parent_cursor)) { uint64_t component; int count; - fr_dbuff_marker_t length_start, inner_seq_len_start; fr_pair_t *child; /* @@ -1194,7 +1197,7 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu slen = fr_der_encode_tag(&our_dbuff, FR_DER_TAG_SEQUENCE, FR_DER_CLASS_UNIVERSAL, FR_DER_TAG_CONSTRUCTED); if (slen < 0) return slen; - fr_dbuff_marker(&inner_seq_len_start, &our_dbuff); + fr_dbuff_set(&inner_seq_len_start, &our_dbuff); FR_DBUFF_ADVANCE_RETURN(&our_dbuff, 1); /* @@ -1203,7 +1206,7 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu slen = fr_der_encode_tag(&our_dbuff, FR_DER_TAG_OID, FR_DER_CLASS_UNIVERSAL, FR_DER_TAG_PRIMITIVE); if (slen < 0) return slen; - fr_dbuff_marker(&length_start, &our_dbuff); + fr_dbuff_set(&length_start, &our_dbuff); FR_DBUFF_ADVANCE_RETURN(&our_dbuff, 1); /* @@ -1287,7 +1290,7 @@ static ssize_t fr_der_encode_X509_extensions(fr_dbuff_t *dbuff, fr_dcursor_t *cu slen = fr_der_encode_tag(&our_dbuff, FR_DER_TAG_OCTETSTRING, FR_DER_CLASS_UNIVERSAL, FR_DER_TAG_PRIMITIVE); if (slen < 0) return slen; - fr_dbuff_marker(&length_start, &our_dbuff); + fr_dbuff_set(&length_start, &our_dbuff); FR_DBUFF_ADVANCE_RETURN(&our_dbuff, 1); /* diff --git a/src/protocols/radius/encode.c b/src/protocols/radius/encode.c index be5f14ca6b3..68af6790b52 100644 --- a/src/protocols/radius/encode.c +++ b/src/protocols/radius/encode.c @@ -1380,7 +1380,7 @@ static ssize_t encode_nas_filter_rule(fr_dbuff_t *dbuff, FR_DBUFF_IN_MEMCPY_RETURN(&work_dbuff, p, frag_len); fr_dbuff_in(&hdr, (uint8_t) UINT8_MAX); - fr_dbuff_marker(&hdr, &work_dbuff); + fr_dbuff_set(&hdr, &work_dbuff); fr_dbuff_advance(&hdr, 1); FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, (uint8_t)vp->da->attr, 0x02); attr_len = 2; @@ -1416,7 +1416,7 @@ static ssize_t encode_nas_filter_rule(fr_dbuff_t *dbuff, * overflow. Create a new header with the zero * byte already populated, and keep going. */ - fr_dbuff_marker(&hdr, &work_dbuff); + fr_dbuff_set(&hdr, &work_dbuff); fr_dbuff_advance(&hdr, 1); FR_DBUFF_IN_BYTES_RETURN(&work_dbuff, (uint8_t)vp->da->attr, 0x00, 0x00); attr_len = 3;