]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
correct encoding of vendor-class "data" field
authorAlan T. DeKok <aland@freeradius.org>
Fri, 13 Aug 2021 17:49:25 +0000 (13:49 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 13 Aug 2021 17:53:29 +0000 (13:53 -0400)
Which should be repeated 16-bit length + data

The decoder already worked correctly, once the dictionary
was updated.

share/dictionary/dhcpv6/dictionary.rfc3315
src/protocols/dhcpv6/encode.c
src/tests/unit/protocols/dhcpv6/rfc8415.txt

index 4bffb726b34cdc48f3df6b5ef6104d6305edbfa5..8ed32523caa2ec3a3629be4ab2f4f016644e19d9 100644 (file)
@@ -125,7 +125,7 @@ ATTRIBUTE   Rapid-Commit                            14      bool
 ATTRIBUTE      User-Class                              15      octets array
 ATTRIBUTE      Vendor-Class                            16      struct
 MEMBER         PEN                                     uint32
-MEMBER         Data                                    octets  # really 2 octets length + data, repeated
+MEMBER         Data                                    octets array
 
 ATTRIBUTE      Vendor-Opts                             17      vsa
 ATTRIBUTE      Interface-ID                            18      octets
index 48fbec22e45b225799f4d95a3618b77cbfacaf4c..ca0438587925ffc02eba73d2b46f288d60952324 100644 (file)
@@ -79,6 +79,26 @@ static inline ssize_t encode_option_hdr(fr_dbuff_marker_t *m, uint16_t option, s
 }
 
 
+static inline ssize_t encode_array(fr_dbuff_t *dbuff,
+                                  fr_da_stack_t *da_stack, int depth,
+                                  fr_dcursor_t *cursor, void *encode_ctx);
+
+static ssize_t encode_value_trampoline(fr_dbuff_t *dbuff,
+                                      fr_da_stack_t *da_stack, unsigned int depth,
+                                      fr_dcursor_t *cursor, void *encode_ctx)
+{
+       fr_dict_attr_t const    *da = da_stack->da[depth];
+
+       /*
+        *      Write out the option's value
+        */
+       if (da->flags.array) {
+               return encode_array(dbuff, da_stack, depth, cursor, encode_ctx);
+       }
+
+       return encode_value(dbuff, da_stack, depth, cursor, encode_ctx);
+}
+
 static ssize_t encode_value(fr_dbuff_t *dbuff,
                            fr_da_stack_t *da_stack, unsigned int depth,
                            fr_dcursor_t *cursor, void *encode_ctx)
@@ -95,7 +115,7 @@ static ssize_t encode_value(fr_dbuff_t *dbuff,
         *      Pack multiple attributes into into a single option
         */
        if ((vp->da->type == FR_TYPE_STRUCT) || (da->type == FR_TYPE_STRUCT)) {
-               slen = fr_struct_to_network(&work_dbuff, da_stack, depth, cursor, encode_ctx, encode_value, encode_tlv);
+               slen = fr_struct_to_network(&work_dbuff, da_stack, depth, cursor, encode_ctx, encode_value_trampoline, encode_tlv);
                if (slen <= 0) return slen;
 
                /*
index 5e5ade413f51713644a501439fef129238d45c8b..74a8773c7a7187b2821340013e07740949240c84 100644 (file)
@@ -628,7 +628,7 @@ match User-Class = 0x1122, User-Class = 0x334455
 #                       value in the option-len field).
 #
 encode-pair Vendor-Class.PEN = 11344, Vendor-Class.Data = 0xb33f
-match 00 10 00 06 00 00 2c 50 b3 3f
+match 00 10 00 08 00 00 2c 50 00 02 b3 3f
 
 decode-pair -
 match Vendor-Class.PEN = 11344, Vendor-Class.Data = 0xb33f