]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
disallow struct[n]
authorAlan T. DeKok <aland@freeradius.org>
Tue, 16 Oct 2018 19:13:41 +0000 (15:13 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Tue, 16 Oct 2018 19:13:41 +0000 (15:13 -0400)
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.

share/dictionary.alcatel.sr
share/dictionary.freeradius.internal
share/dictionary.rfc5447
src/lib/util/dict.c
src/lib/util/struct.c
src/tests/unit/dict.txt
src/tests/unit/dictionary.unit
src/tests/unit/radius_struct.txt

index e5aeceb00017b552c7f44cca192e2a23eaff7ad7..9fe1cb1ae8ef354bc18edc1a380232de2b09482b 100644 (file)
@@ -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
index 98130430fa47412034b0c2e1e2a1fc8bfa7fe19d..c61fe405660af4b6b943d30e8ada1f69cf512ecc 100644 (file)
@@ -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
index 8aed74a7133259866153419ce017f41873e998eb..7f517b18cb1c16045584d7b59d4afe893ae3b570 100644 (file)
@@ -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
index 9d7211d8122d9634c7aedf70dd14a2edcb85b742..d94dcf72f5d572a82fe5fc41955ac2a33430b742 100644 (file)
@@ -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]);
index 3f4dde4c9975d2aa60dc3e589fe395511adefc6c..9587647897ab68913a9aefcae6b1b7ac85ee0c80 100644 (file)
@@ -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;
index e3a9b28bd5147572b72ad104a10764933dc16a16..8292cfeb8cee4ae706ac943405ef8383d9a690a6 100644 (file)
@@ -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"
index 5f6937fc7b5dab2a9e4b438b2cbd4e6453cc07d3..536b0573ca8cdb304f97572d7f2b3bc139e655cc 100644 (file)
@@ -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
 
index 62fed5cab580594be2c8808a1d224a9409b83854..6911c00b12e771edba3b846a99b5b7e48684bf57 100644 (file)
@@ -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