Browse Source

[3692] Prevent infinite loops in allocation engine when pool exhausted.

Marcin Siodelski 10 years ago
parent
commit
77933170ef
1 changed files with 4 additions and 2 deletions
  1. 4 2
      src/lib/dhcpsrv/alloc_engine.cc

+ 4 - 2
src/lib/dhcpsrv/alloc_engine.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2015 Internet Systems Consortium, Inc. ("ISC")
 //
 // Permission to use, copy, modify, and/or distribute this software for any
 // purpose with or without fee is hereby granted, provided that the above
@@ -674,6 +674,9 @@ AllocEngine::allocateLease4(const SubnetPtr& subnet, const ClientIdPtr& clientid
         /// moment, but we currently do not control expiration time at all
         unsigned int i = attempts_;
         do {
+            // Decrease the number of remaining attempts here so as we guarantee
+            // that it is decreased when the code below uses "continue".
+            --i;
             IOAddress candidate = allocator->pickAddress(subnet, clientid,
                                                          ctx.requested_address_);
 
@@ -710,7 +713,6 @@ AllocEngine::allocateLease4(const SubnetPtr& subnet, const ClientIdPtr& clientid
 
             // Continue trying allocation until we run out of attempts
             // (or attempts are set to 0, which means infinite)
-            --i;
         } while ((i > 0) || !attempts_);
 
         // Unable to allocate an address, return an empty lease.