From: Alan T. DeKok Date: Fri, 14 Jan 2022 21:57:34 +0000 (-0500) Subject: return >0 from fr_value_box_from_substr() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=774a8321f9f943c32f6443fd6fa1012490fb5e00;p=thirdparty%2Ffreeradius-server.git return >0 from fr_value_box_from_substr() mainly for ip addresses and prefixes. And also parse scopes for DHCPv6. Line 20 of src/tests/unit/protocols/dhcpv6/addresses.txt says that "scopes are ignored". However, the only reason that the previous tests succeeded was that fr_value_box_from_substr() was returning 0, which meant that fr_value_box_from_str() didn't check that the entire string was being parsed. A first-pass fix was in commit 8a1f819e7f7, but that used an extra sbuff, instead of just re-using our_in, among other faults. --- diff --git a/src/lib/util/value.c b/src/lib/util/value.c index 0ae483f2fb0..09cafe4e23d 100644 --- a/src/lib/util/value.c +++ b/src/lib/util/value.c @@ -4672,8 +4672,8 @@ parse: case FR_TYPE_IPV4_ADDR: { fr_ipaddr_t addr; - fr_sbuff_t ip_start = FR_SBUFF(in); - size_t name_len = fr_sbuff_adv_past_allowed(&ip_start, fr_sbuff_remaining(in), sbuff_char_class_hostname, rules->terminals); + size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals); + if (!name_len) return 0; if (fr_inet_pton4(&addr, fr_sbuff_current(in), name_len, fr_hostname_lookups, false, true) < 0) return -1; @@ -4689,26 +4689,24 @@ parse: } memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip)); - fr_sbuff_advance(in, name_len); } goto finish; case FR_TYPE_IPV4_PREFIX: { - fr_sbuff_t ip_start = FR_SBUFF(in); - size_t name_len = fr_sbuff_adv_past_allowed(&ip_start, fr_sbuff_remaining(in), sbuff_char_class_hostname, rules->terminals); + size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals); + if (!name_len) return 0; if (fr_inet_pton4(&dst->vb_ip, fr_sbuff_current(in), name_len, fr_hostname_lookups, false, true) < 0) return -1; - fr_sbuff_advance(in, name_len); } goto finish; case FR_TYPE_IPV6_ADDR: { fr_ipaddr_t addr; - fr_sbuff_t ip_start = FR_SBUFF(in); - size_t name_len = fr_sbuff_adv_past_allowed(&ip_start, fr_sbuff_remaining(in), sbuff_char_class_hostname, rules->terminals); + size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals); + if (!name_len) return 0; if (fr_inet_pton6(&addr, fr_sbuff_current(in), name_len, fr_hostname_lookups, false, true) < 0) return -1; @@ -4724,18 +4722,28 @@ parse: } memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip)); - fr_sbuff_advance(in, name_len); + + /* + * Parse scopes, too. + */ + if (fr_sbuff_next_if_char(&our_in, '%')) { + slen = fr_sbuff_out(NULL, &dst->vb_ip.scope_id, &our_in); + if (slen <= 0) { + fr_strerror_printf("Failed parsing scope ID"); + return -1; + } + } + } goto finish; case FR_TYPE_IPV6_PREFIX: { - fr_sbuff_t ip_start = FR_SBUFF(in); - size_t name_len = fr_sbuff_adv_past_allowed(&ip_start, fr_sbuff_remaining(in), sbuff_char_class_hostname, rules->terminals); + size_t name_len = fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_hostname, rules->terminals); + if (!name_len) return 0; if (fr_inet_pton6(&dst->vb_ip, fr_sbuff_current(in), name_len, fr_hostname_lookups, false, true) < 0) return -1; - fr_sbuff_advance(in, name_len); } goto finish; @@ -4981,7 +4989,7 @@ finish: dst->enumv = dst_enumv; fr_dlist_entry_init(&dst->entry); - return 0; + return fr_sbuff_set(in, &our_in); } ssize_t fr_value_box_from_str(TALLOC_CTX *ctx, fr_value_box_t *dst,