]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
parse only as much as necessary for IP addresses and prefixes
authorAlan T. DeKok <aland@freeradius.org>
Wed, 17 Nov 2021 18:15:06 +0000 (13:15 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 17 Nov 2021 18:15:06 +0000 (13:15 -0500)
src/lib/util/value.c

index 594f1f66ace82e517d46bdcd0c1d25fcdfce4f13..41b6aa3eaa77305250dd2e2e31e9fc3dfb6ccbfa 100644 (file)
@@ -4554,8 +4554,10 @@ 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);
 
-               if (fr_inet_pton4(&addr, fr_sbuff_current(in), fr_sbuff_remaining(in),
+               if (fr_inet_pton4(&addr, fr_sbuff_current(in), name_len,
                                  fr_hostname_lookups, false, true) < 0) return -1;
 
                /*
@@ -4573,15 +4575,22 @@ parse:
                goto finish;
 
        case FR_TYPE_IPV4_PREFIX:
-               if (fr_inet_pton4(&dst->vb_ip, fr_sbuff_current(in), fr_sbuff_remaining(in),
+       {
+               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);
+
+               if (fr_inet_pton4(&dst->vb_ip, fr_sbuff_current(in), name_len,
                                  fr_hostname_lookups, false, true) < 0) return -1;
+       }
                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);
 
-               if (fr_inet_pton6(&addr, fr_sbuff_current(in), fr_sbuff_remaining(in),
+               if (fr_inet_pton6(&addr, fr_sbuff_current(in), name_len,
                                  fr_hostname_lookups, false, true) < 0) return -1;
 
                /*
@@ -4599,8 +4608,13 @@ parse:
                goto finish;
 
        case FR_TYPE_IPV6_PREFIX:
-               if (fr_inet_pton6(&dst->vb_ip, fr_sbuff_current(in), fr_sbuff_remaining(in),
+       {
+               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);
+
+               if (fr_inet_pton6(&dst->vb_ip, fr_sbuff_current(in), name_len,
                                  fr_hostname_lookups, false, true) < 0) return -1;
+       }
                goto finish;
 
        case FR_TYPE_UINT8: