aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/dhcpc.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 29a6cd5a1..ddfe3ccc0 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -1355,9 +1355,23 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
switch (udhcp_sp_read(&rfds)) {
case SIGUSR1:
client_config.first_secs = 0; /* make secs field count from 0 */
+ already_waited_sec = 0;
perform_renew();
- if (state == RENEW_REQUESTED)
+ if (state == RENEW_REQUESTED) {
+ /* We might be either on the same network
+ * (in which case renew might work),
+ * or we might be on a completely different one
+ * (in which case renew won't ever succeed).
+ * For the second case, must make sure timeout
+ * is not too big, or else we can send
+ * futile renew requests for hours.
+ * (Ab)use -A TIMEOUT value (usually 20 sec)
+ * as a cap on the timeout.
+ */
+ if (timeout > tryagain_timeout)
+ timeout = tryagain_timeout;
goto case_RENEW_REQUESTED;
+ }
/* Start things over */
packet_num = 0;
/* Kill any timeouts, user wants this to hurry along */