]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[v4_1_esv] Fixed crash in dhclient when de-preferencing a lease
authortmarkwalder <tmark@isc.org>
Wed, 21 Jun 2017 15:01:06 +0000 (11:01 -0400)
committertmarkwalder <tmark@isc.org>
Wed, 21 Jun 2017 15:01:06 +0000 (11:01 -0400)
        Merges in rt44373.

RELNOTES
client/dhc6.c

index 6adea6c4591a874bd1416466e84ba45a2387041c..3c5f78b730adb4367550cd42d7531349f1a945a9 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -156,6 +156,12 @@ by Eric Young (eay@cryptsoft.com).
    Parker (wp02855 at gmail dot com) for reporting the issue.
    [ISC-Bugs #41185]
 
+- Corrected a dhclient -6 issue that caused the client to crash with an
+  "Impossible condition" error after de-preferencing its only IA binding.
+  The crash occurred when server configuration changes rendered the existing
+  binding out-of-range and no other leases were available to offer.
+  [ISC-Bugs #44373]
+
                        Changes since 4.1-ESV-R14b1
 - None
 
index cc4453dda7d66c14836dc5f449dfe2842110b931..f008ee17063eefafcc7c59b8a0a4b76386ccd88d 100644 (file)
@@ -1,7 +1,7 @@
 /* dhc6.c - DHCPv6 client routines. */
 
 /*
- * Copyright (c) 2012-2016 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2012-2017 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 2006-2010 by Internet Systems Consortium, Inc. ("ISC")
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -4424,6 +4424,7 @@ dhc6_check_times(struct client_state *client)
        TIME renew=MAX_TIME, rebind=MAX_TIME, depref=MAX_TIME,
             lo_expire=MAX_TIME, hi_expire=0, max_ia_starts = 0, tmp;
        int has_addrs = ISC_FALSE;
+       int has_preferred_addrs = ISC_FALSE;
        struct timeval tv;
 
        lease = client->active_lease;
@@ -4452,6 +4453,10 @@ dhc6_check_times(struct client_state *client)
 
                                if (tmp < depref)
                                        depref = tmp;
+
+                               if (!(addr->flags & DHC6_ADDR_EXPIRED)) {
+                                       has_preferred_addrs = ISC_TRUE;
+                               }
                        }
 
                        if (!(addr->flags & DHC6_ADDR_EXPIRED)) {
@@ -4610,7 +4615,10 @@ dhc6_check_times(struct client_state *client)
                break;
 
              default:
-               log_fatal("Impossible condition at %s:%d.", MDL);
+               if (has_preferred_addrs) {
+                       log_fatal("Impossible condition, state %d at %s:%d.",
+                                 client->state, MDL);
+               }
        }
 
        /* Separately, set a time at which we will depref and expire