]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
return >0 from fr_value_box_from_substr()
authorAlan T. DeKok <aland@freeradius.org>
Fri, 14 Jan 2022 21:57:34 +0000 (16:57 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Fri, 14 Jan 2022 22:05:59 +0000 (17:05 -0500)
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.

src/lib/util/value.c

index 0ae483f2fb0d83bea1a206efaef19762649af972..09cafe4e23d0992c81b4b626607bc7d3c2e937d4 100644 (file)
@@ -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,