From: Alan T. DeKok Date: Tue, 16 Oct 2018 19:13:41 +0000 (-0400) Subject: disallow struct[n] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cf6f7af52d9155b5dabbc66980a47da695eb9e98;p=thirdparty%2Ffreeradius-server.git disallow struct[n] which means that we don't really care about the size of the structs. On encoding, if we run out of room, we just truncat the data as with every other data type. On decoding, if there's too little data, we just return what data we can find. If there's too much data, we just ignore the extra bits. --- diff --git a/share/dictionary.alcatel.sr b/share/dictionary.alcatel.sr index e5aeceb0001..9fe1cb1ae8e 100644 --- a/share/dictionary.alcatel.sr +++ b/share/dictionary.alcatel.sr @@ -56,42 +56,42 @@ ATTRIBUTE Alc-Default-Router 18 ipaddr ATTRIBUTE Alc-Client-Hardware-Addr 27 string # RADIUS subscriber accounting VSAs -ATTRIBUTE Alc-Acct-I-Inprof-Octets-64 19 struct[10] +ATTRIBUTE Alc-Acct-I-Inprof-Octets-64 19 struct ATTRIBUTE Alc-Acct-I-Inprof-Octets-Selection 19.1 byte ATTRIBUTE Alc-Acct-I-Inprof-Octets-Id 19.2 byte ATTRIBUTE Alc-Acct-I-Inprof-Octets 19.3 integer64 -ATTRIBUTE Alc-Acct-I-Outprof-Octets-64 20 struct[10] +ATTRIBUTE Alc-Acct-I-Outprof-Octets-64 20 struct ATTRIBUTE Alc-Acct-I-Outprof-Octets-Selection 20.1 byte ATTRIBUTE Alc-Acct-I-Outprof-Octets-Id 20.2 byte ATTRIBUTE Alc-Acct-I-Outprof-Octets 20.3 integer64 -ATTRIBUTE Alc-Acct-O-Inprof-Octets-64 21 struct[10] +ATTRIBUTE Alc-Acct-O-Inprof-Octets-64 21 struct ATTRIBUTE Alc-Acct-O-Inprof-Octets-Selection 21.1 byte ATTRIBUTE Alc-Acct-O-Inprof-Octets-Id 21.2 byte ATTRIBUTE Alc-Acct-O-Inprof-Octets 21.3 integer64 -ATTRIBUTE Alc-Acct-O-Outprof-Octets-64 22 struct[10] +ATTRIBUTE Alc-Acct-O-Outprof-Octets-64 22 struct ATTRIBUTE Alc-Acct-O-Outprof-Octets-Selection 22.1 byte ATTRIBUTE Alc-Acct-O-Outprof-Octets-Id 22.2 byte ATTRIBUTE Alc-Acct-O-Outprof-Octets 22.3 integer64 -ATTRIBUTE Alc-Acct-I-Inprof-Pkts-64 23 struct[10] +ATTRIBUTE Alc-Acct-I-Inprof-Pkts-64 23 struct ATTRIBUTE Alc-Acct-I-Inprof-Pkts-Selection 23.1 byte ATTRIBUTE Alc-Acct-I-Inprof-Pkts-Id 23.2 byte ATTRIBUTE Alc-Acct-I-Inprof-Pkts 23.3 integer64 -ATTRIBUTE Alc-Acct-I-Outprof-Pkts-64 24 struct[10] +ATTRIBUTE Alc-Acct-I-Outprof-Pkts-64 24 struct ATTRIBUTE Alc-Acct-I-Outprof-Pkts-Selection 24.1 byte ATTRIBUTE Alc-Acct-I-Outprof-Pkts-Id 24.2 byte ATTRIBUTE Alc-Acct-I-Outprof-Pkts 24.3 integer64 -ATTRIBUTE Alc-Acct-O-Inprof-Pkts-64 25 struct[10] +ATTRIBUTE Alc-Acct-O-Inprof-Pkts-64 25 struct ATTRIBUTE Alc-Acct-O-Inprof-Pkts-Selection 25.1 byte ATTRIBUTE Alc-Acct-O-Inprof-Pkts-Id 25.2 byte ATTRIBUTE Alc-Acct-O-Inprof-Pkts 25.3 integer64 -ATTRIBUTE Alc-Acct-O-Outprof-Pkts-64 26 struct[10] +ATTRIBUTE Alc-Acct-O-Outprof-Pkts-64 26 struct ATTRIBUTE Alc-Acct-O-Outprof-Pkts-Selection 26.1 byte ATTRIBUTE Alc-Acct-O-Outprof-Pkts-Id 26.2 byte ATTRIBUTE Alc-Acct-O-Outprof-Pkts 26.3 integer64 @@ -109,35 +109,35 @@ ATTRIBUTE Alc-PPPoE-Service-Name 35 string ATTRIBUTE Alc-DHCP-Vendor-Class-Id 36 string # RADIUS subscriber accounting VSAs (HSMDA override counters) -ATTRIBUTE Alc-Acct-OC-I-Inprof-Octets-64 37 struct[10] +ATTRIBUTE Alc-Acct-OC-I-Inprof-Octets-64 37 struct ATTRIBUTE Alc-Acct-OC-I-Inprof-Octets-Id 37.1 short ATTRIBUTE Alc-Acct-OC-I-Inprof-Octets 37.2 integer64 -ATTRIBUTE Alc-Acct-OC-I-Outprof-Octets-64 38 struct[10] +ATTRIBUTE Alc-Acct-OC-I-Outprof-Octets-64 38 struct ATTRIBUTE Alc-Acct-OC-I-Outprof-Octets-Id 38.1 short ATTRIBUTE Alc-Acct-OC-I-Outprof-Octets 38.2 integer64 -ATTRIBUTE Alc-Acct-OC-O-Inprof-Octets-64 39 struct[10] +ATTRIBUTE Alc-Acct-OC-O-Inprof-Octets-64 39 struct ATTRIBUTE Alc-Acct-OC-O-Inprof-Octets-Id 39.1 short ATTRIBUTE Alc-Acct-OC-O-Inprof-Octets 39.2 integer64 -ATTRIBUTE Alc-Acct-OC-O-Outprof-Octets-64 40 struct[10] +ATTRIBUTE Alc-Acct-OC-O-Outprof-Octets-64 40 struct ATTRIBUTE Alc-Acct-OC-O-Outprof-Octets-Id 40.1 short ATTRIBUTE Alc-Acct-OC-O-Outprof-Octets 40.2 integer64 -ATTRIBUTE Alc-Acct-OC-I-Inprof-Pkts-64 41 struct[10] +ATTRIBUTE Alc-Acct-OC-I-Inprof-Pkts-64 41 struct ATTRIBUTE Alc-Acct-OC-I-Inprof-Pkts-Id 41.1 short ATTRIBUTE Alc-Acct-OC-I-Inprof-Pkts 41.2 integer64 -ATTRIBUTE Alc-Acct-OC-I-Outprof-Pkts-64 42 struct[10] +ATTRIBUTE Alc-Acct-OC-I-Outprof-Pkts-64 42 struct ATTRIBUTE Alc-Acct-OC-I-Outprof-Pkts-Id 42.1 short ATTRIBUTE Alc-Acct-OC-I-Outprof-Pkts 42.2 integer64 -ATTRIBUTE Alc-Acct-OC-O-Inprof-Pkts-64 43 struct[10] +ATTRIBUTE Alc-Acct-OC-O-Inprof-Pkts-64 43 struct ATTRIBUTE Alc-Acct-OC-O-Inprof-Pkts-Id 43.1 short ATTRIBUTE Alc-Acct-OC-O-Inprof-Pkts 43.2 integer64 -ATTRIBUTE Alc-Acct-OC-O-Outprof-Pkts-64 44 struct[10] +ATTRIBUTE Alc-Acct-OC-O-Outprof-Pkts-64 44 struct ATTRIBUTE Alc-Acct-OC-O-Outprof-Pkts-Id 44.1 short ATTRIBUTE Alc-Acct-OC-O-Outprof-Pkts 44.2 integer64 @@ -197,67 +197,67 @@ VALUE Alc-IPsec-SA-Auth-Algorithm sha1 3 ATTRIBUTE Alc-IPsec-SA-Replay-Window 68 integer # RADIUS subscriber accounting VSAs (custom records) -ATTRIBUTE Alc-Acct-I-High-Octets-Drop_64 69 struct[10] +ATTRIBUTE Alc-Acct-I-High-Octets-Drop_64 69 struct ATTRIBUTE Alc-Acct-I-High-Octets-Drop-Id 69.1 short ATTRIBUTE Alc-Acct-I-High-Octets-Drop 69.2 integer64 -ATTRIBUTE Alc-Acct-I-Low-Octets-Drop_64 70 struct[10] +ATTRIBUTE Alc-Acct-I-Low-Octets-Drop_64 70 struct ATTRIBUTE Alc-Acct-I-Low-Octets-Drop-Id 70.1 short ATTRIBUTE Alc-Acct-I-Low-Octets-Drop 70.2 integer64 -ATTRIBUTE Alc-Acct-I-High-Pack-Drop_64 71 struct[10] +ATTRIBUTE Alc-Acct-I-High-Pack-Drop_64 71 struct ATTRIBUTE Alc-Acct-I-High-Pack-Drop-Id 71.1 short ATTRIBUTE Alc-Acct-I-High-Pack-Drop 71.2 integer64 -ATTRIBUTE Alc-Acct-I-Low-Pack-Drop_64 72 struct[10] +ATTRIBUTE Alc-Acct-I-Low-Pack-Drop_64 72 struct ATTRIBUTE Alc-Acct-I-Low-Pack-Drop-Id 72.1 short ATTRIBUTE Alc-Acct-I-Low-Pack-Drop 72.2 integer64 -ATTRIBUTE Alc-Acct-I-High-Octets-Offer_64 73 struct[10] +ATTRIBUTE Alc-Acct-I-High-Octets-Offer_64 73 struct ATTRIBUTE Alc-Acct-I-High-Octets-Offer-Id 73.1 short ATTRIBUTE Alc-Acct-I-High-Octets-Offer 73.2 integer64 -ATTRIBUTE Alc-Acct-I-Low-Octets-Offer_64 74 struct[10] +ATTRIBUTE Alc-Acct-I-Low-Octets-Offer_64 74 struct ATTRIBUTE Alc-Acct-I-Low-Octets-Offer-Id 74.1 short ATTRIBUTE Alc-Acct-I-HigLow-Octets-Offer 74.2 integer64 -ATTRIBUTE Alc-Acct-I-High-Pack-Offer_64 75 struct[10] +ATTRIBUTE Alc-Acct-I-High-Pack-Offer_64 75 struct ATTRIBUTE Alc-Acct-I-High-Packs-Offer-Id 75.1 short ATTRIBUTE Alc-Acct-I-High-Packs-Offer 75.2 integer64 -ATTRIBUTE Alc-Acct-I-Low-Pack-Offer_64 76 struct[10] +ATTRIBUTE Alc-Acct-I-Low-Pack-Offer_64 76 struct ATTRIBUTE Alc-Acct-I-Low-Pack-Offer-Id 76.1 short ATTRIBUTE Alc-Acct-I-Low-Pack-Offer 76.2 integer64 -ATTRIBUTE Alc-Acct-I-Unc-Octets-Offer_64 77 struct[10] +ATTRIBUTE Alc-Acct-I-Unc-Octets-Offer_64 77 struct ATTRIBUTE Alc-Acct-I-Unc-Octets-Offer-Id 77.1 short ATTRIBUTE Alc-Acct-I-Unc-Octets-Offer 77.2 integer64 -ATTRIBUTE Alc-Acct-I-Unc-Pack-Offer_64 78 struct[10] +ATTRIBUTE Alc-Acct-I-Unc-Pack-Offer_64 78 struct ATTRIBUTE Alc-Acct-I-Unc-Pack-Offer-Id 78.1 short ATTRIBUTE Alc-Acct-I-unc-Pack-Offer 78.2 integer64 -ATTRIBUTE Alc-Acct-I-All-Octets-Offer_64 79 struct[10] +ATTRIBUTE Alc-Acct-I-All-Octets-Offer_64 79 struct ATTRIBUTE Alc-Acct-I-All-Octets-Offer-Id 79.1 short ATTRIBUTE Alc-Acct-I-All-Octets-Offer 79.2 integer64 -ATTRIBUTE Alc-Acct-I-All-Pack-Offer_64 80 struct[10] +ATTRIBUTE Alc-Acct-I-All-Pack-Offer_64 80 struct ATTRIBUTE Alc-Acct-I-All-Pack-Offer-Id 80.1 short ATTRIBUTE Alc-Acct-I-All-Pack-Offer 80.2 integer64 -ATTRIBUTE Alc-Acct-O-Inprof-Pack-Drop_64 81 struct[10] +ATTRIBUTE Alc-Acct-O-Inprof-Pack-Drop_64 81 struct ATTRIBUTE Alc-Acct-O-Inprof-Pack-Drop-Id 81.1 short ATTRIBUTE Alc-Acct-O-Inprof-Pack-Drop 81.2 integer64 -ATTRIBUTE Alc-Acct-O-Outprof-Pack-Drop_64 82 struct[10] +ATTRIBUTE Alc-Acct-O-Outprof-Pack-Drop_64 82 struct ATTRIBUTE Alc-Acct-O-Outprof-Pack-Drop-Id 82.1 short ATTRIBUTE Alc-Acct-O-Outprof-Pack-Drop 82.2 integer64 -ATTRIBUTE Alc-Acct-O-Inprof-Octs-Drop_64 83 struct[10] +ATTRIBUTE Alc-Acct-O-Inprof-Octs-Drop_64 83 struct ATTRIBUTE Alc-Acct-O-Inprof-Octs-Drop-Id 83.1 short ATTRIBUTE Alc-Acct-O-Inprof-Octs-Drop 83.2 integer64 -ATTRIBUTE Alc-Acct-O-Outprof-Octs-Drop_64 84 struct[10] +ATTRIBUTE Alc-Acct-O-Outprof-Octs-Drop_64 84 struct ATTRIBUTE Alc-Acct-O-Outprof-Octs-Drop-Id 84.1 short ATTRIBUTE Alc-Acct-O-Outprof-Octs-Drop 84.2 integer64 @@ -295,62 +295,62 @@ ATTRIBUTE Alc-Ipv6-Secondary-Dns 106 ipv6addr # RADIUS subscriber accounting VSAs (Policers) ATTRIBUTE Alc-Acct-I-statmode 107 string -ATTRIBUTE Alc-Acct-I-Hiprio-Octets_64 108 struct[10] +ATTRIBUTE Alc-Acct-I-Hiprio-Octets_64 108 struct ATTRIBUTE Alc-Acct-I-Hiprio-Octets-x80 108.1 byte ATTRIBUTE Alc-Acct-I-Hiprio-Octets-Id 108.2 byte ATTRIBUTE Alc-Acct-I-Hiprio-Octets 108.3 integer64 -ATTRIBUTE Alc-Acct-I-Lowprio-Octets_64 109 struct[10] +ATTRIBUTE Alc-Acct-I-Lowprio-Octets_64 109 struct ATTRIBUTE Alc-Acct-I-Lowprio-Octets-x80 109.1 byte ATTRIBUTE Alc-Acct-I-Lowprio-Octets-Id 109.2 byte ATTRIBUTE Alc-Acct-I-Lowprio-Octets 109.3 integer64 -ATTRIBUTE Alc-Acct-O-Hiprio-Octets_64 110 struct[10] +ATTRIBUTE Alc-Acct-O-Hiprio-Octets_64 110 struct ATTRIBUTE Alc-Acct-O-Hiprio-Octets-x80 110.1 byte ATTRIBUTE Alc-Acct-O-Hiprio-Octets-Id 110.2 byte ATTRIBUTE Alc-Acct-O-Hiprio-Octets 110.3 integer64 -ATTRIBUTE Alc-Acct-O-Lowprio-Octets_64 111 struct[10] +ATTRIBUTE Alc-Acct-O-Lowprio-Octets_64 111 struct ATTRIBUTE Alc-Acct-O-Lowprio-Octets-x80 111.1 byte ATTRIBUTE Alc-Acct-O-Lowprio-Octets-Id 111.2 byte ATTRIBUTE Alc-Acct-O-Lowprio-Octets 111.3 integer64 -ATTRIBUTE Alc-Acct-I-Hiprio-Packets_64 112 struct[10] +ATTRIBUTE Alc-Acct-I-Hiprio-Packets_64 112 struct ATTRIBUTE Alc-Acct-I-Hiprio-Packets-x80 112.1 byte ATTRIBUTE Alc-Acct-I-Hiprio-Packets-Id 112.2 byte ATTRIBUTE Alc-Acct-I-Hiprio-Packets 112.3 integer64 -ATTRIBUTE Alc-Acct-I-Lowprio-Packets_64 113 struct[10] +ATTRIBUTE Alc-Acct-I-Lowprio-Packets_64 113 struct ATTRIBUTE Alc-Acct-I-Lowprio-Packets-x80 113.1 byte ATTRIBUTE Alc-Acct-I-Lowprio-Packets-Id 113.2 byte ATTRIBUTE Alc-Acct-I-Lowprio-Packets 113.3 integer64 -ATTRIBUTE Alc-Acct-O-Hiprio-Packets_64 114 struct[10] +ATTRIBUTE Alc-Acct-O-Hiprio-Packets_64 114 struct ATTRIBUTE Alc-Acct-O-Hiprio-Packets-x80 114.1 byte ATTRIBUTE Alc-Acct-O-Hiprio-Packets-Id 114.2 byte ATTRIBUTE Alc-Acct-O-Hiprio-Packets 114.3 integer64 -ATTRIBUTE Alc-Acct-O-Lowprio-Packets_64 115 struct[10] +ATTRIBUTE Alc-Acct-O-Lowprio-Packets_64 115 struct ATTRIBUTE Alc-Acct-O-Lowprio-Packets-x80 115.1 byte ATTRIBUTE Alc-Acct-O-Lowprio-Packets-Id 115.2 byte ATTRIBUTE Alc-Acct-O-Lowprio-Packets 115.3 integer64 -ATTRIBUTE Alc-Acct-I-All-Octets_64 116 struct[10] +ATTRIBUTE Alc-Acct-I-All-Octets_64 116 struct ATTRIBUTE Alc-Acct-I-All-Octets-x80 116.1 byte ATTRIBUTE Alc-Acct-I-All-Octets-Id 116.2 byte ATTRIBUTE Alc-Acct-I-All-Octets 116.3 integer64 -ATTRIBUTE Alc-Acct-O-All-Octets_64 117 struct[10] +ATTRIBUTE Alc-Acct-O-All-Octets_64 117 struct ATTRIBUTE Alc-Acct-O-All-Octets-x80 117.1 byte ATTRIBUTE Alc-Acct-O-All-Octets-Id 117.2 byte ATTRIBUTE Alc-Acct-O-All-Octets 117.3 integer64 -ATTRIBUTE Alc-Acct-I-All-Packets_64 118 struct[10] +ATTRIBUTE Alc-Acct-I-All-Packets_64 118 struct ATTRIBUTE Alc-Acct-I-All-Packets-x80 118.1 byte ATTRIBUTE Alc-Acct-I-All-Packets-Id 118.2 byte ATTRIBUTE Alc-Acct-I-All-Packets 118.3 integer64 -ATTRIBUTE Alc-Acct-O-All-Packets_64 119 struct[10] +ATTRIBUTE Alc-Acct-O-All-Packets_64 119 struct ATTRIBUTE Alc-Acct-O-All-Packets-x80 119.1 byte ATTRIBUTE Alc-Acct-O-All-Packets-Id 119.2 byte ATTRIBUTE Alc-Acct-O-All-Packets 119.3 integer64 diff --git a/share/dictionary.freeradius.internal b/share/dictionary.freeradius.internal index 98130430fa4..c61fe405660 100644 --- a/share/dictionary.freeradius.internal +++ b/share/dictionary.freeradius.internal @@ -47,7 +47,7 @@ ATTRIBUTE Prefix 1003 string ATTRIBUTE Suffix 1004 string ATTRIBUTE Group 1005 string ATTRIBUTE Crypt-Password 1006 string -#ATTRIBUTE Connect-Rate 1007 integer +ATTRIBUTE Connect-Rate 1007 integer ATTRIBUTE Add-Prefix 1008 string ATTRIBUTE Add-Suffix 1009 string ATTRIBUTE Expiration 1010 date diff --git a/share/dictionary.rfc5447 b/share/dictionary.rfc5447 index 8aed74a7133..7f517b18cb1 100644 --- a/share/dictionary.rfc5447 +++ b/share/dictionary.rfc5447 @@ -13,6 +13,6 @@ ATTRIBUTE MIP6-Feature-Vector 124 integer64 # # Encoded as one octet prefix, followed by 16 octets of address information. # -ATTRIBUTE MIP6-Home-Link-Prefix 125 struct[17] +ATTRIBUTE MIP6-Home-Link-Prefix 125 struct ATTRIBUTE MIP6-Home-Link-Prefix-Prefix 125.1 uint8 ATTRIBUTE MIP6-Home-Link-Prefix-Address 125.2 ipv6addr diff --git a/src/lib/util/dict.c b/src/lib/util/dict.c index 9d7211d8122..d94dcf72f5d 100644 --- a/src/lib/util/dict.c +++ b/src/lib/util/dict.c @@ -697,26 +697,10 @@ static bool dict_attr_fields_valid(fr_dict_t *dict, fr_dict_attr_t const *parent fr_strerror_printf("The 'length' flag can only be used with attributes of TLV lengths of 1,2 or 4"); goto error; } - - } else if ((type != FR_TYPE_OCTETS) && - (type != FR_TYPE_STRUCT)) { + } else if (type != FR_TYPE_OCTETS) { fr_strerror_printf("The 'length' flag can only be set for attributes of type 'octets' or 'struct'"); goto error; } - - if (type == FR_TYPE_STRUCT) { - if (flags->type_size != 0) { - fr_strerror_printf("Invalid initializer for type_size"); - goto error; - } - - /* - * Set maximum length for the struct, and - * initialize the current length to be zero. - */ - flags->type_size = flags->length; - flags->length = 0; - } } /* @@ -1044,7 +1028,6 @@ static bool dict_attr_fields_valid(fr_dict_t *dict, fr_dict_attr_t const *parent fr_strerror_printf("Invalid flag for attribute of type 'struct'"); goto error; } - break; case FR_TYPE_STRING: @@ -1060,8 +1043,6 @@ static bool dict_attr_fields_valid(fr_dict_t *dict, fr_dict_attr_t const *parent * Validate attribute based on parent. */ if (parent->type == FR_TYPE_STRUCT) { - fr_dict_attr_t *mutable; - if (flags->encrypt != FLAG_ENCRYPT_NONE) { fr_strerror_printf("Attributes inside a 'struct' MUST NOT be encrypted."); goto error; @@ -1075,11 +1056,6 @@ static bool dict_attr_fields_valid(fr_dict_t *dict, fr_dict_attr_t const *parent if (*attr > 1) { fr_dict_attr_t const *sibling; - if (!parent->flags.length) { - fr_strerror_printf("Children of 'struct' type attributes MUST start with sub-attribute 1."); - goto error; - } - sibling = fr_dict_attr_child_by_num(parent, (*attr) - 1); if (!sibling) { fr_strerror_printf("Children of 'struct' type attributes MUST be numbered consecutively."); @@ -1102,32 +1078,6 @@ static bool dict_attr_fields_valid(fr_dict_t *dict, fr_dict_attr_t const *parent goto error; } } - - /* - * Sneak in the length of the children. - */ - memcpy(&mutable, &parent, sizeof(mutable)); - - /* - * The struct has a maximum size. Complain if we exceed it. - */ - if (flags->length) { - if (mutable->flags.type_size && ((mutable->flags.length + flags->length) > mutable->flags.type_size)) { - fr_strerror_printf("Child attribute causes struct to overflow maximum size of %d octets", - mutable->flags.type_size); - goto error; - } - mutable->flags.length += flags->length; - - } else { - /* - * This is a bad hack... set the struct - * size to it's maximum value, which - * indicates that it has variable length. - */ - mutable->flags.length = 0; - } - } return true; @@ -3952,6 +3902,11 @@ get_by_oid: if (p) { char *q; + if (type != FR_TYPE_OCTETS) { + fr_strerror_printf("Only 'octets' types can have a 'length' parameter"); + return -1; + } + q = strchr(p + 1, ']'); if (!q) { fr_strerror_printf("Invalid format for '%s[...]'", argv[2]); diff --git a/src/lib/util/struct.c b/src/lib/util/struct.c index 3f4dde4c997..9587647897a 100644 --- a/src/lib/util/struct.c +++ b/src/lib/util/struct.c @@ -77,18 +77,6 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_cursor_init(&child_cursor, &head); *child_p = NULL; - /* - * Data is too small for the structure, ignore it. - */ - if (data_len < parent->flags.length) { - raw: - vp = fr_unknown_from_network(ctx, parent, data, data_len); - if (!vp) return -1; - - fr_cursor_append(&child_cursor, vp); - return data_len; - } - child_num = 1; while (p < end) { size_t child_length; @@ -143,7 +131,12 @@ ssize_t fr_struct_from_network(TALLOC_CTX *ctx, fr_cursor_t *cursor, TALLOC_FREE(vp); fr_pair_list_free(&head); fr_cursor_init(&child_cursor, &head); - goto raw; + + vp = fr_unknown_from_network(ctx, parent, data, data_len); + if (!vp) return -1; + + fr_cursor_append(&child_cursor, vp); + return data_len; } vp->type = VT_DATA; diff --git a/src/tests/unit/dict.txt b/src/tests/unit/dict.txt index e3a9b28bd51..8292cfeb8ce 100644 --- a/src/tests/unit/dict.txt +++ b/src/tests/unit/dict.txt @@ -55,7 +55,7 @@ dictionary ATTRIBUTE Unit-Array 255 octets[123458] data Invalid length for 'octets[...]' dictionary ATTRIBUTE Unit-Integer 255 integer[1] -data Definition for 'Unit-Integer' is invalid: The 'length' flag can only be set for attributes of type 'octets' or 'struct' +data Only 'octets' types can have a 'length' parameter dictionary ATTRIBUTE Unit-$bad$stuff 255 integer data Invalid character '$' in attribute name "Unit-$bad$stuff" diff --git a/src/tests/unit/dictionary.unit b/src/tests/unit/dictionary.unit index 5f6937fc7b5..536b0573ca8 100644 --- a/src/tests/unit/dictionary.unit +++ b/src/tests/unit/dictionary.unit @@ -32,6 +32,11 @@ ATTRIBUTE Unit-Struct3a .2.1 struct ATTRIBUTE Unit-Struct3a-Ipaddr1 .2.1.1 ipaddr ATTRIBUTE Unit-Struct3a-Ipaddr2 .2.1.2 ipaddr +ATTRIBUTE Unit-Struct4 241.250 struct +ATTRIBUTE Unit-Struct4-Int1 .1 integer +ATTRIBUTE Unit-Struct4-Int2 .2 integer +ATTRIBUTE Unit-Struct4-Short .3 uint16 + ATTRIBUTE Unit-TLV-Integer 241.243.1 integer diff --git a/src/tests/unit/radius_struct.txt b/src/tests/unit/radius_struct.txt index 62fed5cab58..6911c00b12e 100644 --- a/src/tests/unit/radius_struct.txt +++ b/src/tests/unit/radius_struct.txt @@ -25,3 +25,30 @@ data f1 11 f9 00 00 00 01 01 0a 7f 00 00 01 08 08 08 08 decode-pair - data Unit-Struct3-Int = 1, Unit-Struct3a-Ipaddr1 = 127.0.0.1, Unit-Struct3a-Ipaddr2 = 8.8.8.8 + +# +# Fixed size struct +# +encode-pair Unit-Struct4-Int1 = 1, Unit-Struct4-Int2 = 2, Unit-Struct4-Short = 4 +data f1 0d fa 00 00 00 01 00 00 00 02 00 04 + +decode-pair - +data Unit-Struct4-Int1 = 1, Unit-Struct4-Int2 = 2, Unit-Struct4-Short = 4 + +# +# Wrong-sized struct (last field missing), it just decodes what it can. +# +decode-pair f1 0b fa 00 00 00 01 00 00 00 02 +data Unit-Struct4-Int1 = 1, Unit-Struct4-Int2 = 2 + +# +# Wrong-sized struct (last two fields missing), it just decodes what it can. +# +decode-pair f1 07 fa 00 00 00 01 +data Unit-Struct4-Int1 = 1 + +# +# Wrong-sized struct (data is too long), we ignore the extra data. +# +decode-pair f1 0e fa 00 00 00 01 00 00 00 02 00 04 00 +data Unit-Struct4-Int1 = 1, Unit-Struct4-Int2 = 2, Unit-Struct4-Short = 4