]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
parse combo-ip and combo-ip
authorAlan T. DeKok <aland@freeradius.org>
Thu, 7 Dec 2023 17:25:01 +0000 (12:25 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Thu, 7 Dec 2023 17:35:33 +0000 (12:35 -0500)
src/lib/util/value.c

index 74210811fb9e0087c077ef7f61352804ffb2e114..69068def975976f1d68d850fa978b68e9287c076 100644 (file)
@@ -4809,6 +4809,7 @@ parse:
                 *      print them this way.
                 */
                if (addr.prefix != 32) {
+               fail_ipv4_prefix:
                        fr_strerror_printf("Invalid IPv4 mask length \"/%i\".  Only \"/32\" permitted "
                                           "for non-prefix types", addr.prefix);
                        return -1;
@@ -4849,6 +4850,7 @@ parse:
                 *      print them this way.
                 */
                if (addr.prefix != 128) {
+               fail_ipv6_prefix:
                        fr_strerror_printf("Invalid IPv6 mask length \"/%i\".  Only \"/128\" permitted "
                                           "for non-prefix types", addr.prefix);
                        return -1;
@@ -4868,6 +4870,44 @@ parse:
        }
                goto finish;
 
+       case FR_TYPE_COMBO_IP_ADDR:
+       {
+               fr_ipaddr_t addr;
+               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;
+
+               /*
+                *      Parse scope, too.
+                */
+               if (fr_sbuff_next_if_char(&our_in, '%')) {
+                       name_len += fr_sbuff_adv_past_allowed(&our_in, fr_sbuff_remaining(&our_in), sbuff_char_class_uint, rules->terminals);
+               }
+
+               if (fr_inet_pton(&addr, fr_sbuff_current(in), name_len, AF_UNSPEC,
+                                fr_hostname_lookups, true) < 0) return -1;
+
+               if ((addr.af == AF_INET) && (addr.prefix != 32)) {
+                       goto fail_ipv4_prefix;
+               }
+
+               if ((addr.af == AF_INET6) && (addr.prefix != 128)) {
+                       goto fail_ipv6_prefix;
+               }
+
+               memcpy(&dst->vb_ip, &addr, sizeof(dst->vb_ip));
+       }
+               goto finish;
+
+       case FR_TYPE_COMBO_IP_PREFIX:
+       {
+               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_pton(&dst->vb_ip, fr_sbuff_current(in), name_len, AF_UNSPEC,
+                                 fr_hostname_lookups, true) < 0) return -1;
+       }
+               goto finish;
+
        case FR_TYPE_UINT8:
        case FR_TYPE_UINT16:
        case FR_TYPE_UINT32: