From: Alan T. DeKok Date: Wed, 17 Nov 2021 18:15:06 +0000 (-0500) Subject: parse only as much as necessary for IP addresses and prefixes X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a1f819e7f7;p=thirdparty%2Ffreeradius-server.git parse only as much as necessary for IP addresses and prefixes --- diff --git a/src/lib/util/value.c b/src/lib/util/value.c index 594f1f66ac..41b6aa3eaa 100644 --- a/src/lib/util/value.c +++ b/src/lib/util/value.c @@ -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: