]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
fr_struct_from_network() always creates nested attributes
authorAlan T. DeKok <aland@freeradius.org>
Mon, 28 Oct 2024 23:27:52 +0000 (19:27 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 29 Oct 2024 13:48:57 +0000 (09:48 -0400)
src/lib/util/struct.c
src/lib/util/struct.h
src/protocols/arp/base.c
src/protocols/bfd/decode.c
src/protocols/dhcpv4/decode.c
src/protocols/dhcpv6/decode.c
src/protocols/dns/decode.c
src/protocols/radius/decode.c
src/protocols/tacacs/decode.c

index b977aefecc2a45c96ddaf9f7eb323ab053160183..a87a9510bfb7653ae32547900fd3e44143a12ac2 100644 (file)
@@ -32,7 +32,7 @@ RCSID("$Id$")
  */
 ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
                               fr_dict_attr_t const *parent, uint8_t const *data, size_t data_len,
-                              bool nested, void *decode_ctx,
+                              void *decode_ctx,
                               fr_pair_decode_value_t decode_value, fr_pair_decode_value_t decode_tlv)
 {
        unsigned int            child_num;
@@ -55,23 +55,17 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
        /*
         *      Start a child list.
         */
-       if (!nested) {
-               fr_pair_list_init(&child_list_head);
-               child_list = &child_list_head;
-               child_ctx = ctx;
-       } else {
-               fr_assert(parent->type == FR_TYPE_STRUCT);
-
-               struct_vp = fr_pair_afrom_da(ctx, parent);
-               if (!struct_vp) {
-                       fr_strerror_const("out of memory");
-                       return -1;
-               }
+       fr_assert(parent->type == FR_TYPE_STRUCT);
 
-               fr_pair_list_init(&child_list_head); /* still used elsewhere */
-               child_list = &struct_vp->vp_group;
-               child_ctx = struct_vp;
+       struct_vp = fr_pair_afrom_da(ctx, parent);
+       if (!struct_vp) {
+               fr_strerror_const("out of memory");
+               return -1;
        }
+
+       fr_pair_list_init(&child_list_head); /* still used elsewhere */
+       child_list = &struct_vp->vp_group;
+       child_ctx = struct_vp;
        child_num = 1;
        key_vp = NULL;
 
@@ -315,11 +309,7 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
                        FR_PROTO_TRACE("fr_struct_from_network - failed decoding child VP %s", vp->da->name);
                        talloc_free(vp);
                unknown:
-                       if (nested) {
-                               TALLOC_FREE(struct_vp);
-                       } else {
-                               fr_pair_list_free(child_list);
-                       }
+                       TALLOC_FREE(struct_vp);
 
                        slen = fr_pair_raw_from_network(ctx, out, parent, data, data_len);
                        if (slen < 0) return slen;
@@ -389,7 +379,7 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
                } else {
                        fr_assert(child->type == FR_TYPE_STRUCT);
 
-                       slen = fr_struct_from_network(child_ctx, child_list, child, p, end - p, nested,
+                       slen = fr_struct_from_network(child_ctx, child_list, child, p, end - p,
                                                      decode_ctx, decode_value, decode_tlv);
                        if (slen <= 0) {
                                FR_PROTO_TRACE("substruct %s decoding failed", child->name);
@@ -402,12 +392,8 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
        }
 
 done:
-       if (!nested) {
-               fr_pair_list_append(out, child_list);   /* Wind to the end of the new pairs */
-       } else {
-               fr_assert(struct_vp != NULL);
-               fr_pair_append(out, struct_vp);
-       }
+       fr_assert(struct_vp != NULL);
+       fr_pair_append(out, struct_vp);
 
        FR_PROTO_TRACE("used %zd bytes", data_len);
        return p - data;
index ef0a351572a7367899fa2f5d81114b9a978f8ab1..6f06d4bd17fb07e22a05950ac7842ab68b409103 100644 (file)
@@ -36,7 +36,7 @@ extern "C" {
 
 ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_pair_list_t *out,
                               fr_dict_attr_t const *parent, uint8_t const *data, size_t data_len,
-                              bool nested, void *decode_ctx,
+                              void *decode_ctx,
                               fr_pair_decode_value_t decode_value, fr_pair_decode_value_t decode_tlv) CC_HINT(nonnull(2,3,4));
 
 ssize_t fr_struct_to_network(fr_dbuff_t *dbuff, fr_da_stack_t *da_stack, unsigned int depth,
index 1ae2e63121095920132e006e3fe93da6b7d77768..5deb6d5ea176b2ea4257e4e3bf71e0d0cb887f0a 100644 (file)
@@ -254,7 +254,7 @@ ssize_t fr_arp_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *packe
        /*
         *      If the packet is too long, we discard any extra data.
         */
-       return fr_struct_from_network(ctx, out, attr_arp_packet, packet, FR_ARP_PACKET_SIZE, true,
+       return fr_struct_from_network(ctx, out, attr_arp_packet, packet, FR_ARP_PACKET_SIZE,
                                      NULL, NULL, NULL);
 }
 
index 81e33fdf9ddf629533b7ee705542dd8d3cc817ed..debfba70d724937aadc27efb3cee01d330223bfc 100644 (file)
@@ -75,7 +75,7 @@ ssize_t fr_bfd_decode(TALLOC_CTX *ctx, fr_pair_list_t *out,
 
        bfd = (bfd_packet_t const *) packet;
 
-       slen = fr_struct_from_network(ctx, out, attr_bfd_packet, packet, bfd->length, true,
+       slen = fr_struct_from_network(ctx, out, attr_bfd_packet, packet, bfd->length,
                                      &packet_ctx, decode_value, NULL);
        if (slen < 0) return slen;
 
index 120ea0b59c66a5e6e98490e0b7628f9426dc7ca4..904fac7b39a8eba49ff978e8645a790e10c66658 100644 (file)
@@ -102,7 +102,7 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t
         *      Structs create their own VP wrapper.
         */
        if (da->type == FR_TYPE_STRUCT) {
-               slen = fr_struct_from_network(ctx, out, da, data, data_len, true,
+               slen = fr_struct_from_network(ctx, out, da, data, data_len,
                                              decode_ctx, decode_value_trampoline, decode_tlv_trampoline);
                if (slen < 0) return slen;
 
index 229367b33a884ba550ee919d8acff3d170f1a58b..c33c13905743cf91838d25153f9429fb7908e23b 100644 (file)
@@ -176,7 +176,7 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_pair_list_t *out,
                break;
 
        case FR_TYPE_STRUCT:
-               slen = fr_struct_from_network(ctx, out, parent, data, data_len, true,
+               slen = fr_struct_from_network(ctx, out, parent, data, data_len,
                                              decode_ctx, decode_value_trampoline, decode_tlv_trampoline);
                if (slen < 0) goto raw;
 
index 414fd452997c9ac10a80738eea0b13c2cf6229d5..6097a513850db9c462ca00b8bf7555072dc178c0 100644 (file)
@@ -141,7 +141,7 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_pair_list_t *out,
                break;
 
        case FR_TYPE_STRUCT:
-               slen = fr_struct_from_network(ctx, out, parent, data, data_len, true,
+               slen = fr_struct_from_network(ctx, out, parent, data, data_len,
                                              decode_ctx, decode_value_trampoline, NULL);
                if (slen < 0) return slen;
                return data_len;
@@ -246,7 +246,7 @@ static ssize_t decode_record(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_
 
                FR_PROTO_HEX_DUMP(p, end - p, "fr_dns_decode - %s %d/%d", attr->name, i, count);
 
-               slen = fr_struct_from_network(ctx, out, attr, p, end - p, true,
+               slen = fr_struct_from_network(ctx, out, attr, p, end - p,
                                              packet_ctx, decode_value_trampoline, decode_tlv_trampoline);
                if (slen < 0) return slen;
                if (!slen) break;
@@ -278,7 +278,7 @@ ssize_t     fr_dns_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, uint8_t const *packe
        /*
         *      Decode the header.
         */
-       slen = fr_struct_from_network(ctx, out, attr_dns_packet, packet, DNS_HDR_LEN, true,
+       slen = fr_struct_from_network(ctx, out, attr_dns_packet, packet, DNS_HDR_LEN,
                                      packet_ctx, decode_value_trampoline, NULL); /* no TLVs in the header */
        if (slen < 0) {
                fr_strerror_printf("Failed decoding DNS header - %s", fr_strerror());
@@ -361,7 +361,7 @@ static ssize_t decode_rr(TALLOC_CTX *ctx, fr_pair_list_t *out, UNUSED fr_dict_at
                return -1;
        }
 
-       slen = fr_struct_from_network(ctx, out, attr_dns_rr, data, data_len, true,
+       slen = fr_struct_from_network(ctx, out, attr_dns_rr, data, data_len,
                                      decode_ctx, decode_value_trampoline, decode_tlv_trampoline);
        if (slen < 0) return slen;
 
index 44f690a3fc2d7b6710a0592960136f8cecba672b..a10c5e603739e4ae8a2b51957f450ed71e01bac2 100644 (file)
@@ -452,6 +452,8 @@ static ssize_t decode_rfc(TALLOC_CTX *ctx, fr_pair_list_t *out,
 
        da = fr_dict_attr_child_by_num(parent, attr);
        if (!da) {
+               fprintf(stderr, "RAW %d - %s %u\n", __LINE__, parent->name, attr);
+
                da = fr_dict_attr_unknown_raw_afrom_num(packet_ctx->tmp_ctx, parent, attr);
                if (!da) return PAIR_DECODE_FATAL_ERROR;
                slen = fr_pair_raw_from_network(ctx, out, da, data + 2, len - 2);
@@ -685,6 +687,7 @@ ssize_t fr_radius_decode_tlv(TALLOC_CTX *ctx, fr_pair_list_t *out,
                         *      Child is unknown and not a TLV: build an unknown attr
                         */
                        if (fr_radius_decode_tlv_ok(p + 2, p[1] - 2, 1, 1) < 0) {
+                               fprintf(stderr, "RAW %d - %s %u\n", __LINE__, parent->name, p[0]);
                                child = fr_dict_attr_unknown_raw_afrom_num(packet_ctx->tmp_ctx, parent, p[0]);
                                if (!child) {
                                error:
@@ -817,6 +820,7 @@ static ssize_t decode_vsa_internal(TALLOC_CTX *ctx, fr_pair_list_t *out,
                 *      well formed, so we just go create a raw VP.
                 */
        } else if ((dv->length == 0) || (fr_radius_decode_tlv_ok(data + dv->type + dv->length, attrlen - (dv->type + dv->length), dv->type, dv->length) < 0)) {
+               fprintf(stderr, "RAW %d - %s %u\n", __LINE__, parent->name, attribute);
                da = fr_dict_attr_unknown_raw_afrom_num(packet_ctx->tmp_ctx, parent, attribute);
                if (!da) return -1;
 
@@ -1789,7 +1793,7 @@ ssize_t fr_radius_decode_pair_value(TALLOC_CTX *ctx, fr_pair_list_t *out,
                 *      attribute, OR it's already been grouped
                 *      into a contiguous memory buffer.
                 */
-               ret = fr_struct_from_network(ctx, out, parent, p, attr_len, true,
+               ret = fr_struct_from_network(ctx, out, parent, p, attr_len,
                                             packet_ctx, decode_value_trampoline, decode_tlv_trampoline);
                if (ret < 0) goto raw;
                return attr_len;
index ab36459f3c694533c254b6a5cd13247400260971..65119e48ca57ab616f5788f3c64847b1039f66e4 100644 (file)
@@ -509,7 +509,7 @@ ssize_t fr_tacacs_decode(TALLOC_CTX *ctx, fr_pair_list_t *out, fr_dict_attr_t co
        /*
         *      Call the struct encoder to do the actual work.
         */
-       if (fr_struct_from_network(ctx, out, attr_tacacs_packet, buffer, buffer_len, true, NULL, NULL, NULL) < 0) {
+       if (fr_struct_from_network(ctx, out, attr_tacacs_packet, buffer, buffer_len, NULL, NULL, NULL) < 0) {
                fr_strerror_printf("Failed decoding TACACS header - %s", fr_strerror());
                return -1;
        }