]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
fix encode / decode of boolean
authorAlan T. DeKok <aland@freeradius.org>
Wed, 1 Apr 2020 21:26:19 +0000 (17:26 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 1 Apr 2020 21:26:19 +0000 (17:26 -0400)
Rapid-Commit should be boolean, not empty octets.

Encoding was correct, in that it skipped encoding the value.

Decoding was wrong, in that it called the standard "from network"
code, which looked for one byte of a boolean value.

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

index 009d66d0d8c94bfdef72be0b76721aeb7e772b72..f40ac11d5edca26bea995286a10a677e0d53a704 100644 (file)
@@ -121,7 +121,7 @@ VALUE       Status-Code-Value               DNSUpdateNotSupported   21
 VALUE  Status-Code-Value               ExcessiveTimeSkew       22
 # Unassigned   23-65535
 
-ATTRIBUTE      Rapid-Commit                            14      octets  # only used to signal. no values.
+ATTRIBUTE      Rapid-Commit                            14      bool
 ATTRIBUTE      User-Class                              15      octets array
 ATTRIBUTE      Vendor-Class                            16      struct
 MEMBER         Vendor-Class-PEN                        uint32
index 7e58ad712254bf8678a8e20f56ea888dd0c51c6a..ef99fc82eb3866f8ae0cddac946183ce3b53765f 100644 (file)
@@ -174,6 +174,18 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_dict_t cons
                memcpy(&vp->vp_ipv6addr, data + 1, data_len - 1);
                break;
 
+               /*
+                *      A bool is encoded as an empty option if it's
+                *      true.  A bool is omitted entirely if it's
+                *      false.
+                */
+       case FR_TYPE_BOOL:
+               if (data_len != 0) goto raw;
+               vp = fr_pair_afrom_da(ctx, parent);
+               if (!vp) return PAIR_DECODE_OOM;
+               vp->vp_bool = true;
+               break;
+
        case FR_TYPE_UINT8:
        case FR_TYPE_UINT16:
        case FR_TYPE_UINT32:
@@ -188,7 +200,6 @@ static ssize_t decode_value(TALLOC_CTX *ctx, fr_cursor_t *cursor, fr_dict_t cons
        case FR_TYPE_COMBO_IP_PREFIX:
        case FR_TYPE_INT32:
        case FR_TYPE_TIME_DELTA:
-       case FR_TYPE_BOOL:
        case FR_TYPE_OCTETS:
        case FR_TYPE_STRING:
                vp = fr_pair_afrom_da(ctx, parent);
index 7f230416ba471292c53ab8a98ed93cab534781cc..ead81d2e8670b5e568b8c6bdf7b14dbd9728ecf1 100644 (file)
@@ -300,6 +300,10 @@ static ssize_t encode_value(uint8_t *out, size_t outlen,
         *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         */
        case FR_TYPE_BOOL:
+               /*
+                *      Don't encode anything!  The mere existence of
+                *      the attribute signifies a "true" value.
+                */
                break;
 
        /*
index 117b4e20f7ea785ca31f48d2c7c8eda0271378c0..8decb13e14f03625a6c3ac7cd32a5d6a29713a1a 100644 (file)
@@ -9,13 +9,20 @@ proto dhcpv6
 proto-dictionary dhcpv6
 
 #
-#  Bool
+#  True values are encoded by using an empty attribute.
 #
-encode-pair Rapid-Commit = 0x
+#  False values are encoded by nothing.
+#
+encode-pair Rapid-Commit = yes
 match 00 0e 00 00
 
 decode-pair -
-match Rapid-Commit = 0x
+match Rapid-Commit = yes
+
+encode-pair Rapid-Commit = no
+match 
+
+# And we can't decode nothing...
 
 count
-match 6
+match 8
index 12c388cf50fe370d19c5cba187114f233aa942a5..8be7c8a47b3db4b93f74e784811e01f0fec66192 100644 (file)
@@ -26,11 +26,11 @@ proto-dictionary dhcpv6
 #    Client Identifier
 #    Elapsed time
 #
-encode-proto Packet-Type = Solicit, Transaction-ID = 0xabcdef, Rapid-Commit = 0x, IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, Client-FQDN-Flag-Reserved = 0, Client-FQDN-Flag-No-Server-Update = yes, Client-FQDN-Flag-Server-Override = no, Client-FQDN-Flag-Server-Update = no, Client-FQDN-Domain-Name = "tapioca01", Option-Request = DNS-Servers, Option-Request = Domain-List, Option-Request = NTP-Server, Option-Request = SNTP-Servers, Option-Request = Rapid-Commit, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Elapsed-Time = 45887
+encode-proto Packet-Type = Solicit, Transaction-ID = 0xabcdef, Rapid-Commit = yes, IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, Client-FQDN-Flag-Reserved = 0, Client-FQDN-Flag-No-Server-Update = yes, Client-FQDN-Flag-Server-Override = no, Client-FQDN-Flag-Server-Update = no, Client-FQDN-Domain-Name = "tapioca01", Option-Request = DNS-Servers, Option-Request = Domain-List, Option-Request = NTP-Server, Option-Request = SNTP-Servers, Option-Request = Rapid-Commit, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Elapsed-Time = 45887
 match 01 ab cd ef 00 0e 00 00 00 03 00 10 0a bc de f0 00 00 d3 4d 00 00 b3 3f 00 60 01 ad 00 27 00 0b 04 09 74 61 70 69 6f 63 61 30 31 00 06 00 0a 00 17 00 18 00 38 00 1f 00 0e 00 01 00 12 00 04 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 08 00 02 b3 3f
 
 decode-proto -
-match Packet-Type = Solicit, Transaction-ID = 0xabcdef, Rapid-Commit = 0x, IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, Client-FQDN-Flag-Reserved = 0, Client-FQDN-Flag-No-Server-Update = yes, Client-FQDN-Flag-Server-Override = no, Client-FQDN-Flag-Server-Update = no, Client-FQDN-Domain-Name = "tapioca01", Option-Request = DNS-Servers, Option-Request = Domain-List, Option-Request = NTP-Server, Option-Request = SNTP-Servers, Option-Request = Rapid-Commit, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Elapsed-Time = 45887
+match Packet-Type = Solicit, Transaction-ID = 0xabcdef, Rapid-Commit = yes, IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, Client-FQDN-Flag-Reserved = 0, Client-FQDN-Flag-No-Server-Update = yes, Client-FQDN-Flag-Server-Override = no, Client-FQDN-Flag-Server-Update = no, Client-FQDN-Domain-Name = "tapioca01", Option-Request = DNS-Servers, Option-Request = Domain-List, Option-Request = NTP-Server, Option-Request = SNTP-Servers, Option-Request = Rapid-Commit, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Elapsed-Time = 45887
 
 #
 #  2. Advertise (Server -> Client)
@@ -45,11 +45,11 @@ match Packet-Type = Solicit, Transaction-ID = 0xabcdef, Rapid-Commit = 0x, IA-NA
 #    Domain Search List
 #    Identity Association for Non-temporary Address
 #
-encode-proto Packet-Type = Advertise, Transaction-ID = 0xabcdef, Rapid-Commit = 0x, Server-ID-DUID = Server-ID-DUID-UUID, Server-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, SOL-Max-RT = 3721182122, DNS-Servers = 2804:14d:2a73:44ab::123, DNS-Servers = 2804:14d:2a73:44ab::456, Domain-List = "mydomain1.com", Domain-List = "mydomain2.lan", Domain-List = "corp.mydomain3.co", IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, IA-Addr-IPv6-Address = fd85:d2bb:92c:1:74ae:2871:f56c:8d94, IA-Addr-Preferred-Lifetime = 120, IA-Addr-Valid-Lifetime = 86400, IA-Addr-Options = 0x006001ad
+encode-proto Packet-Type = Advertise, Transaction-ID = 0xabcdef, Rapid-Commit = yes, Server-ID-DUID = Server-ID-DUID-UUID, Server-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, SOL-Max-RT = 3721182122, DNS-Servers = 2804:14d:2a73:44ab::123, DNS-Servers = 2804:14d:2a73:44ab::456, Domain-List = "mydomain1.com", Domain-List = "mydomain2.lan", Domain-List = "corp.mydomain3.co", IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, IA-Addr-IPv6-Address = fd85:d2bb:92c:1:74ae:2871:f56c:8d94, IA-Addr-Preferred-Lifetime = 120, IA-Addr-Valid-Lifetime = 86400, IA-Addr-Options = 0x006001ad
 match 02 ab cd ef 00 0e 00 00 00 02 00 12 00 04 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 01 00 12 00 04 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 00 52 00 04 dd cc bb aa 00 17 00 20 28 04 01 4d 2a 73 44 ab 00 00 00 00 00 00 01 23 28 04 01 4d 2a 73 44 ab 00 00 00 00 00 00 04 56 00 18 00 31 09 6d 79 64 6f 6d 61 69 6e 31 03 63 6f 6d 00 09 6d 79 64 6f 6d 61 69 6e 32 03 6c 61 6e 00 04 63 6f 72 70 09 6d 79 64 6f 6d 61 69 6e 33 02 63 6f 00 00 03 00 10 0a bc de f0 00 00 d3 4d 00 00 b3 3f 00 60 01 ad 00 05 00 1c fd 85 d2 bb 09 2c 00 01 74 ae 28 71 f5 6c 8d 94 00 00 00 78 00 01 51 80 00 60 01 ad
 
 decode-proto -
-match Packet-Type = Advertise, Transaction-ID = 0xabcdef, Rapid-Commit = 0x, Server-ID-DUID = Server-ID-DUID-UUID, Server-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, SOL-Max-RT = 3721182122, DNS-Servers = 2804:14d:2a73:44ab::123, DNS-Servers = 2804:14d:2a73:44ab::456, Domain-List = "mydomain1.com", Domain-List = "mydomain2.lan", Domain-List = "corp.mydomain3.co", IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, IA-Addr-IPv6-Address = fd85:d2bb:92c:1:74ae:2871:f56c:8d94, IA-Addr-Preferred-Lifetime = 120, IA-Addr-Valid-Lifetime = 86400, IA-Addr-Options = 0x006001ad
+match Packet-Type = Advertise, Transaction-ID = 0xabcdef, Rapid-Commit = yes, Server-ID-DUID = Server-ID-DUID-UUID, Server-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, Client-ID-DUID = Client-ID-DUID-UUID, Client-ID-DUID-UUID-Value = 0x000102030405060708090a0b0c0d0e0f, SOL-Max-RT = 3721182122, DNS-Servers = 2804:14d:2a73:44ab::123, DNS-Servers = 2804:14d:2a73:44ab::456, Domain-List = "mydomain1.com", Domain-List = "mydomain2.lan", Domain-List = "corp.mydomain3.co", IA-NA-IAID = 180150000, IA-NA-T1 = 54093, IA-NA-T2 = 45887, IA-NA-Options = 0x006001ad, IA-Addr-IPv6-Address = fd85:d2bb:92c:1:74ae:2871:f56c:8d94, IA-Addr-Preferred-Lifetime = 120, IA-Addr-Valid-Lifetime = 86400, IA-Addr-Options = 0x006001ad
 
 #
 #  3. Request (Client -> Broadcast)
index bb8637ae43aa173b5e963c81c8607f8dc94413cd..8e4295d0ad90c009fdf72eb159c63090a37f989e 100644 (file)
@@ -550,11 +550,11 @@ match Status-Code-Value = NoPrefixAvail, Status-Code-Message = "Tapioca com quei
 #
 #  option-len           0.
 #
-encode-pair Rapid-Commit = 0x
+encode-pair Rapid-Commit = yes
 match 00 0e 00 00
 
 decode-pair -
-match Rapid-Commit = 0x
+match Rapid-Commit = yes
 
 #
 #  21.15.  User Class Option