]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
When processing a request in the DHCPv6 server code that specifies
authorShawn Routhier <sar@isc.org>
Thu, 20 Jan 2011 19:13:41 +0000 (19:13 +0000)
committerShawn Routhier <sar@isc.org>
Thu, 20 Jan 2011 19:13:41 +0000 (19:13 +0000)
an address that is tagged as abondened (meaning we received a
decline request for it previously) don't attempt to move it from
the inactive to active pool as doing so can result in the server
crshing on an assert failure.  Also retag the lease as active
and reset it's timeout value.
[ISC-Bugs #21921]

RELNOTES
server/mdb6.c

index 78811b7d5c1cd3288593898ebfa3710363b67f75..890dd3767152fdaaa36e2ba68e970d0e31213b1d 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -180,6 +180,14 @@ work on other platforms. Please report any problems and suggested fixes to
   use all available cpu if the program daemonized itself.
   [ISC-Bugs #21911]
 
+! When processing a request in the DHCPv6 server code that specifies
+  an address that is tagged as abondened (meaning we received a
+  decline request for it previously) don't attempt to move it from
+  the inactive to active pool as doing so can result in the server
+  crshing on an assert failure.  Also retag the lease as active
+  and reset it's timeout value.
+  [ISC-Bugs #21921]
                        Changes since 4.2.0b2
 
 - Add declaration for variable in debug code in alloc.c.  [ISC-Bugs #21472]
index bbd671f4704f79956bd8640650112899de1fb5ee..9d410f551ff64abad96de287e529c5e240f1f649 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2009 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (C) 2007-2011 by Internet Systems Consortium, Inc. ("ISC")
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -1010,7 +1010,7 @@ move_lease_to_active(struct ipv6_pool *pool, struct iasubopt *lease) {
  * Renew an lease in the pool.
  *
  * To do this, first set the new hard_lifetime_end_time for the resource,
- * and then invoke renew_lease() on it.
+ * and then invoke renew_lease6() on it.
  *
  * WARNING: lease times must only be extended, never reduced!!!
  */
@@ -1020,12 +1020,24 @@ renew_lease6(struct ipv6_pool *pool, struct iasubopt *lease) {
         * If we're already active, then we can just move our expiration
         * time down the heap. 
         *
+        * If we're abandoned then we are already on the active list
+        * but we need to retag the lease and move our expiration
+        * from infinite to the current value
+        *
         * Otherwise, we have to move from the inactive heap to the 
         * active heap.
         */
        if (lease->state == FTS_ACTIVE) {
                isc_heap_decreased(pool->active_timeouts, lease->heap_index);
                return ISC_R_SUCCESS;
+       } else if (lease->state == FTS_ABANDONED) {
+               char tmp_addr[INET6_ADDRSTRLEN];
+                lease->state = FTS_ACTIVE;
+                isc_heap_increased(pool->active_timeouts, lease->heap_index);
+               log_info("Reclaiming previously abandoned address %s",
+                        inet_ntop(AF_INET6, &(lease->addr), tmp_addr,
+                                  sizeof(tmp_addr)));
+                return ISC_R_SUCCESS;
        } else {
                return move_lease_to_active(pool, lease);
        }
@@ -1115,7 +1127,8 @@ isc_result_t
 decline_lease6(struct ipv6_pool *pool, struct iasubopt *lease) {
        isc_result_t result;
 
-       if (lease->state != FTS_ACTIVE) {
+       if ((lease->state != FTS_ACTIVE) &&
+           (lease->state != FTS_ABANDONED)) {
                result = move_lease_to_active(pool, lease);
                if (result != ISC_R_SUCCESS) {
                        return result;