options: emit an empty address item when resolving networks fails
[project/firewall3.git] / options.c
index ae6bf5dbd89ec0da9462a75ce3ece2567f4cc249..6d2a283fdd8a95f03cdfb3295cb54db8720bed9b 100644 (file)
--- a/options.c
+++ b/options.c
@@ -342,19 +342,31 @@ fw3_parse_network(void *ptr, const char *val, bool is_list)
        struct fw3_device dev = { };
        struct fw3_address *addr, *tmp;
        LIST_HEAD(addr_list);
+       int n_addrs;
 
        if (!fw3_parse_address(ptr, val, is_list))
        {
                if (!fw3_parse_device(&dev, val, false))
                        return false;
 
-               fw3_ubus_address(&addr_list, dev.name);
+               n_addrs = fw3_ubus_address(&addr_list, dev.name);
+
                list_for_each_entry(addr, &addr_list, list)
                {
                        addr->invert = dev.invert;
                        addr->resolved = true;
                }
 
+               /* add an empty address member with .set = false, .resolved = true
+                * to signal resolving failure to callers */
+               if (n_addrs == 0)
+               {
+                       tmp = fw3_alloc(sizeof(*tmp));
+                       tmp->resolved = true;
+
+                       list_add_tail(&tmp->list, &addr_list);
+               }
+
                if (is_list)
                {
                        list_splice_tail(&addr_list, ptr);
@@ -991,7 +1003,6 @@ fw3_parse_options(void *s, const struct fw3_option *opts,
                                        {
                                                warn_elem(e, "has invalid value '%s'", p);
                                                valid = false;
-                                               continue;
                                        }
                                }
                        }