]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
hack up encode_array() to not cross option boundaries
authorAlan T. DeKok <aland@freeradius.org>
Fri, 11 Mar 2022 12:53:57 +0000 (07:53 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 11 Mar 2022 15:41:08 +0000 (10:41 -0500)
this really needs to be fixed in the decoder

src/protocols/dhcpv4/encode.c
src/tests/unit/protocols/dhcpv4/base.txt

index c7fe4b151ba48fd3823f5a646ec7ac3bf5b3fd1a..50c60d71adaa3f2581cab5c1bd62e5e7e27366a7 100644 (file)
@@ -188,6 +188,13 @@ static ssize_t encode_array(fr_dbuff_t *dbuff,
                        FR_DBUFF_ADVANCE_RETURN(&element_dbuff, sizeof(uint8_t));       /* Make room for the length field */
                }
 
+               /*
+                *      Don't pack too many things in.
+                *
+                *      @todo - fix dhcpv4 decode, because the elements can, in fact, cross option boundaries.
+                */
+               if ((fr_dbuff_used(&work_dbuff) + element_len + len_field) > 255) break;
+
                slen = encode_value(&element_dbuff, da_stack, depth, cursor, encode_ctx);
                if (slen < 0) return slen;
                if (slen > UINT8_MAX) return PAIR_ENCODE_FATAL_ERROR;
index e3c063c41d3d38a4e6b443ca34e2dba3658904ea..1ac736d49f6572a436572b9524f03bd976c0083e 100644 (file)
@@ -34,14 +34,8 @@ match 8a 08 7f 00 00 01 c0 a8 03 01
 # Overflow with multiple fixed length attributes (16x16)
 encode-pair ANDSF-IPv6-Address = fe80::1, ANDSF-IPv6-Address = fe80::2, ANDSF-IPv6-Address = fe80::3, ANDSF-IPv6-Address = fe80::4, ANDSF-IPv6-Address = fe80::5, ANDSF-IPv6-Address = fe80::6, ANDSF-IPv6-Address = fe80::7, ANDSF-IPv6-Address = fe80::8, ANDSF-IPv6-Address = fe80::9, ANDSF-IPv6-Address = fe80::a, ANDSF-IPv6-Address = fe80::b, ANDSF-IPv6-Address = fe80::c, ANDSF-IPv6-Address = fe80::d, ANDSF-IPv6-Address = fe80::e, ANDSF-IPv6-Address = fe80::f, ANDSF-IPv6-Address = fe80::10
 
-#
-#  We now fill each option, instead of splitting on value boundaries.
-#
-match 8f ff fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 01 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 02 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 03 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 04 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 05 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 06 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 07 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 08 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 09 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0a fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0b fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0c fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0d fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0e fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0f fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 8f 01 10
+match 8f f0 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 01 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 02 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 03 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 04 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 05 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 06 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 07 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 08 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 09 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0a fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0b fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0c fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0d fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0e fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 0f 8f 10 fe 80 00 00 00 00 00 00 00 00 00 00 00 00 00 10
 
-#
-#  The decode routine is broken, as it needs concatenate and then decode, instead of decoding each value in turn.
-#
 decode-pair -
 match ANDSF-IPv6-Address = fe80::1, ANDSF-IPv6-Address = fe80::2, ANDSF-IPv6-Address = fe80::3, ANDSF-IPv6-Address = fe80::4, ANDSF-IPv6-Address = fe80::5, ANDSF-IPv6-Address = fe80::6, ANDSF-IPv6-Address = fe80::7, ANDSF-IPv6-Address = fe80::8, ANDSF-IPv6-Address = fe80::9, ANDSF-IPv6-Address = fe80::a, ANDSF-IPv6-Address = fe80::b, ANDSF-IPv6-Address = fe80::c, ANDSF-IPv6-Address = fe80::d, ANDSF-IPv6-Address = fe80::e, ANDSF-IPv6-Address = fe80::f, ANDSF-IPv6-Address = fe80::10