]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[v4_1_esv] Server now permits one UID to hold leases in multiple subnets
authorThomas Markwalder <tmark@isc.org>
Tue, 4 Oct 2016 19:04:09 +0000 (15:04 -0400)
committerThomas Markwalder <tmark@isc.org>
Tue, 4 Oct 2016 19:04:09 +0000 (15:04 -0400)
    Merges in rt41358.

RELNOTES
server/dhcp.c

index 05f604fcf37d0c30577c579f9d9fa230303ab414..a4f96afbd8947e85db9fbd6f4118eaa67ff74a1c 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -58,8 +58,18 @@ ISC DHCP is open source software maintained by Internet Systems
 Consortium.  This product includes cryptographic software written
 by Eric Young (eay@cryptsoft.com).
 
-                       Changes since 4.1-ESV-R14b1
+                       Changes since 4.1-ESV-R14
+
+- The server now allows the client identifier (option 61) to own leases
+  in more than one subnet concurrently. Prior to this the server would
+  incorrectly release an existing lease in one subnet prior to assigning
+  a lease in another subnet. Note that the prior behavior can be still
+  be achieved by enabling one-lease-per-client. Thanks to both David Zych at
+  the University of Illinois and Norm Proffitt of Infoblox for reporting
+  the issue; and Norm for suggesting a solution.
+  [ISC-Bugs #41358]
 
+                       Changes since 4.1-ESV-R14b1
 - None
 
                        Changes since 4.1-ESV-R13
index 3f50c6a9c4ef01f5f845921fcd1ebecb0fc98c61..88baa0d469a1a0f2efb712c07233e47998cadb1c 100644 (file)
@@ -3466,6 +3466,7 @@ int find_lease (struct lease **lp,
         * preference, so the first one is the best one.
         */
        while (uid_lease) {
+               isc_boolean_t do_release = !packet->raw->ciaddr.s_addr;
 #if defined (DEBUG_FIND_LEASE)
                log_info ("trying next lease matching client id: %s",
                          piaddr (uid_lease -> ip_addr));
@@ -3490,6 +3491,9 @@ int find_lease (struct lease **lp,
                        log_info ("wrong network segment: %s",
                                  piaddr (uid_lease -> ip_addr));
 #endif
+                       /* Allow multiple leases using the same UID
+                          on different subnetworks. */
+                       do_release = ISC_FALSE;
                        goto n_uid;
                }
 
@@ -3505,7 +3509,7 @@ int find_lease (struct lease **lp,
                        if (uid_lease -> n_uid)
                                lease_reference (&next,
                                                 uid_lease -> n_uid, MDL);
-                       if (!packet -> raw -> ciaddr.s_addr)
+                       if (do_release)
                                release_lease (uid_lease, packet);
                        lease_dereference (&uid_lease, MDL);
                        if (next) {