From: Alan T. DeKok Date: Wed, 1 Apr 2020 21:26:19 +0000 (-0400) Subject: fix encode / decode of boolean X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9bccd6eb268bdcf41ff46dc22474720f3cd99357;p=thirdparty%2Ffreeradius-server.git fix encode / decode of boolean 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. --- diff --git a/share/dictionary/dhcpv6/dictionary.rfc3315 b/share/dictionary/dhcpv6/dictionary.rfc3315 index 009d66d0d8c..f40ac11d5ed 100644 --- a/share/dictionary/dhcpv6/dictionary.rfc3315 +++ b/share/dictionary/dhcpv6/dictionary.rfc3315 @@ -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 diff --git a/src/protocols/dhcpv6/decode.c b/src/protocols/dhcpv6/decode.c index 7e58ad71225..ef99fc82eb3 100644 --- a/src/protocols/dhcpv6/decode.c +++ b/src/protocols/dhcpv6/decode.c @@ -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); diff --git a/src/protocols/dhcpv6/encode.c b/src/protocols/dhcpv6/encode.c index 7f230416ba4..ead81d2e867 100644 --- a/src/protocols/dhcpv6/encode.c +++ b/src/protocols/dhcpv6/encode.c @@ -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; /* diff --git a/src/tests/unit/protocols/dhcpv6/bools.txt b/src/tests/unit/protocols/dhcpv6/bools.txt index 117b4e20f7e..8decb13e14f 100644 --- a/src/tests/unit/protocols/dhcpv6/bools.txt +++ b/src/tests/unit/protocols/dhcpv6/bools.txt @@ -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 diff --git a/src/tests/unit/protocols/dhcpv6/packet_client_server.txt b/src/tests/unit/protocols/dhcpv6/packet_client_server.txt index 12c388cf50f..8be7c8a47b3 100644 --- a/src/tests/unit/protocols/dhcpv6/packet_client_server.txt +++ b/src/tests/unit/protocols/dhcpv6/packet_client_server.txt @@ -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) diff --git a/src/tests/unit/protocols/dhcpv6/rfc8415.txt b/src/tests/unit/protocols/dhcpv6/rfc8415.txt index bb8637ae43a..8e4295d0ad9 100644 --- a/src/tests/unit/protocols/dhcpv6/rfc8415.txt +++ b/src/tests/unit/protocols/dhcpv6/rfc8415.txt @@ -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