dhcpv4: fix adding assignment in list (FS#2142)
authorHans Dedecker <dedeckeh@gmail.com>
Mon, 25 Feb 2019 09:48:44 +0000 (10:48 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Mon, 25 Feb 2019 10:20:31 +0000 (11:20 +0100)
Add assignment to the tail of the list in case the last element
is not bigger

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/dhcpv4.c

index ff2d8c2..5016390 100644 (file)
@@ -917,8 +917,12 @@ static bool dhcpv4_assign(struct interface *iface, struct dhcp_assignment *a,
                }
 
                list_for_each_entry(c, &iface->dhcpv4_assignments, head) {
-                       if (ntohl(c->addr) > ntohl(raddr)) {
-                               list_add_tail(&a->head, &c->head);
+                       if (ntohl(raddr) == ntohl(c->addr))
+                               break;
+
+                       if (ntohl(c->addr) > ntohl(raddr) || list_is_last(&c->head, &iface->dhcpv4_assignments)) {
+                               list_add_tail(&a->head,
+                                             ntohl(c->addr) > ntohl(raddr) ? &c->head : &iface->dhcpv4_assignments);
 raddr_out:
                                a->addr = raddr;
 
@@ -927,8 +931,7 @@ raddr_out:
                                       ((uint8_t *)&a->addr)[2], ((uint8_t *)&a->addr)[3]);
 
                                return true;
-                       } else if (ntohl(raddr) == ntohl(c->addr))
-                               break;
+                       }
                }
        }
 
@@ -959,8 +962,12 @@ raddr_out:
                }
 
                list_for_each_entry(c, &iface->dhcpv4_assignments, head) {
-                       if (ntohl(c->addr) > try) {
-                               list_add_tail(&a->head, &c->head);
+                       if (try == ntohl(c->addr))
+                               break;
+
+                       if (ntohl(c->addr) > try || list_is_last(&c->head, &iface->dhcpv4_assignments)) {
+                               list_add_tail(&a->head,
+                                             ntohl(c->addr) > try ? &c->head : &iface->dhcpv4_assignments);
                                a->addr = htonl(try);
 
                                syslog(LOG_DEBUG, "Assigning mapped IP: %u.%u.%u.%u (try %u of %u)",
@@ -969,8 +976,7 @@ raddr_out:
                                        i, count);
 
                                return true;
-                       } else if (try == ntohl(c->addr))
-                               break;
+                       }
                }
        }