]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
only call marker() functions once.
authorAlan T. DeKok <aland@freeradius.org>
Wed, 11 Mar 2026 22:25:17 +0000 (18:25 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 11 Mar 2026 22:28:37 +0000 (18:28 -0400)
one the second pass, call set()

src/protocols/der/decode.c
src/protocols/der/encode.c
src/protocols/radius/encode.c

index 57a977ff2591167685c13be62d1f99fee493adc8..32c3d51347b9ea80011541424b8e7eef522ceda4 100644 (file)
@@ -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(&current_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(&current_value_marker, &our_in);
+                       fr_dbuff_set(&current_value_marker, &our_in);
 
                        /*
                         *      Ensure that the contents of the tags are sorted.
index 5bdf9dab3a6692b12bd96a3d2a9d754e787d4bbe..f7fb14aac1fb0c5262699ac1f76175d7c8595076 100644 (file)
@@ -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);
 
                /*
index be5f14ca6b3b163965fa39c86e0f15e669936ece..68af6790b529cac18866ab9afe2d2734165e34e5 100644 (file)
@@ -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;