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
This commit is contained in:
Martin Blapp 2004-08-16 21:26:04 +00:00
parent 7611a6dcd6
commit 93fb40624f

View File

@ -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. */