diff options
-rw-r--r-- | RELNOTES | 9 | ||||
-rw-r--r-- | server/dhcp.c | 6 |
2 files changed, 14 insertions, 1 deletions
@@ -117,6 +117,15 @@ by Eric Young (eay@cryptsoft.com). configure --with-libbind). [ISC-Bugs #43285] +- 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.3.0 (bug fixes) - Tidy up several small tickets. diff --git a/server/dhcp.c b/server/dhcp.c index c9b36325..a490f635 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -4152,6 +4152,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)); @@ -4182,6 +4183,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; } @@ -4197,7 +4201,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) { |