config: use multi-stage parsing of uci sections
authorDainis Jonitis <dainis.jonitis@ubnt.com>
Mon, 29 Apr 2019 11:47:13 +0000 (14:47 +0300)
committerHans Dedecker <dedeckeh@gmail.com>
Fri, 3 May 2019 12:51:52 +0000 (14:51 +0200)
When loading uci sections from config file, in one pass do not
mix sections from different types. First load odhcpd global
settings, then all interface sections and finally static leases.
It ensures that section order in file can't affect what information
is already parsed. For example static lease section may need
information about all interfaces, to decide whether ip address
belongs to any of currently defined interfaces/address pools.

Signed-off-by: Dainis Jonitis <dainis.jonitis@ubnt.com>
src/config.c

index dfeadac63fc18cdfaf61731804a155bd078a3eda..f1fe82b3312ac7cf2adf3747959e4f7788a06447 100644 (file)
@@ -965,19 +965,27 @@ void odhcpd_reload(void)
        struct uci_package *dhcp = NULL;
        if (!uci_load(uci, "dhcp", &dhcp)) {
                struct uci_element *e;
+
+               /* 1. Global settings */
                uci_foreach_element(&dhcp->sections, e) {
                        struct uci_section *s = uci_to_section(e);
-                       if (!strcmp(s->type, "host"))
-                               set_lease(s);
-                       else if (!strcmp(s->type, "odhcpd"))
+                       if (!strcmp(s->type, "odhcpd"))
                                set_config(s);
                }
 
+               /* 2. DHCP pools */
                uci_foreach_element(&dhcp->sections, e) {
                        struct uci_section *s = uci_to_section(e);
                        if (!strcmp(s->type, "dhcp"))
                                set_interface(s);
                }
+
+               /* 3. Static leases */
+               uci_foreach_element(&dhcp->sections, e) {
+                       struct uci_section* s = uci_to_section(e);
+                       if (!strcmp(s->type, "host"))
+                               set_lease(s);
+               }
        }
 
        if (config.dhcp_statefile) {