dhcpv4: avoid segfault when there's no IPv4 prefix
[project/odhcpd.git] / src / dhcpv4.c
index db900c138528a861052b972937575561fa2b3b44..b0a4603acdfce156b646b8556d92031a3dc2dcc7 100644 (file)
@@ -95,7 +95,8 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable)
                        return -1;
                }
 
-               uint32_t mask = iface->addr4[0].prefix ? htonl(~((1 << (32 - iface->addr4[0].prefix)) - 1)) : 0;
+               uint32_t mask = iface->addr4 && iface->addr4[0].prefix ?
+                       htonl(~((1 << (32 - iface->addr4[0].prefix)) - 1)) : 0xffffffff;
 
                /* Create a range if not specified */
                if (!(iface->dhcpv4_start.s_addr & htonl(0xffff0000)) &&
@@ -587,7 +588,6 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
 
        if (msg == DHCPV4_MSG_DISCOVER || msg == DHCPV4_MSG_REQUEST) {
                bool assigned = !!a;
-               uint32_t my_leasetime;
 
                if (!a && !iface->no_dynamic_dhcp) {
                        /* Create new binding */
@@ -605,15 +605,17 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                                list_add(&a->head, &iface->dhcpv4_assignments);
                }
 
-               if (a->leasetime)
-                       my_leasetime = a->leasetime;
-               else
-                       my_leasetime = iface->dhcpv4_leasetime;
+               if (assigned) {
+                       uint32_t my_leasetime;
 
-               if ((*leasetime == 0) || (my_leasetime < *leasetime))
-                       *leasetime = my_leasetime;
+                       if (a->leasetime)
+                               my_leasetime = a->leasetime;
+                       else
+                               my_leasetime = iface->dhcpv4_leasetime;
+
+                       if ((*leasetime == 0) || (my_leasetime < *leasetime))
+                               *leasetime = my_leasetime;
 
-               if (assigned) {
                        if (msg == DHCPV4_MSG_DISCOVER) {
                                a->flags &= ~OAF_BOUND;