From 93fb40624f556e1f00df50cd20b4199cc3832e47 Mon Sep 17 00:00:00 2001 From: Martin Blapp Date: Mon, 16 Aug 2004 21:26:04 +0000 Subject: [PATCH] Recommit removed Rev. 1.40. This fix does solve a FPE with negative lease time as described in the PR below. It seems that this patch should have been part of the vendor tree but got accidently missed in the 3.0.1 final version. It will definitly be part of 3.0.2 but until then it's a long way to go. Submitted by: ISC (Vendor) PR: bin/54517 --- contrib/isc-dhcp/client/dhclient.c | 31 ++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/contrib/isc-dhcp/client/dhclient.c b/contrib/isc-dhcp/client/dhclient.c index a942051a1168..939bc7a2b3cf 100644 --- a/contrib/isc-dhcp/client/dhclient.c +++ b/contrib/isc-dhcp/client/dhclient.c @@ -838,11 +838,15 @@ void dhcpack (packet) /* If it wasn't specified by the server, calculate it. */ if (!client -> new -> renewal) - client -> new -> renewal = - client -> new -> expiry / 2; + client -> new -> renewal = client -> new -> expiry / 2 + 1; + + if (client -> new -> renewal <= 0) + client -> new -> renewal = TIME_MAX; /* Now introduce some randomness to the renewal time: */ - client -> new -> renewal = (((client -> new -> renewal + 3) * 3 / 4) + + if (client -> new -> renewal <= TIME_MAX / 3 - 3) + client -> new -> renewal = + (((client -> new -> renewal + 3) * 3 / 4) + (random () % /* XXX NUMS */ ((client -> new -> renewal + 3) / 4))); @@ -861,14 +865,25 @@ void dhcpack (packet) } else client -> new -> rebind = 0; - if (!client -> new -> rebind) - client -> new -> rebind = - (client -> new -> expiry * 7) / 8; /* XXX NUMS */ + if (client -> new -> rebind <= 0) { + if (client -> new -> expiry <= TIME_MAX / 7) + client -> new -> rebind = + client -> new -> expiry * 7 / 8; + else + client -> new -> rebind = + client -> new -> expiry / 8 * 7; + } /* Make sure our randomness didn't run the renewal time past the rebind time. */ - if (client -> new -> renewal > client -> new -> rebind) - client -> new -> renewal = (client -> new -> rebind * 3) / 4; + if (client -> new -> renewal > client -> new -> rebind) { + if (client -> new -> rebind <= TIME_MAX / 3) + client -> new -> renewal = + client -> new -> rebind * 3 / 4; + else + client -> new -> renewal = + client -> new -> rebind / 4 * 3; + } client -> new -> expiry += cur_time; /* Lease lengths can never be negative. */