68 lines
2.2 KiB
Diff
68 lines
2.2 KiB
Diff
From 098d7f8e2e2b468e6a615084fb4330fed49bb54a Mon Sep 17 00:00:00 2001
|
|
From: hanzhijun <hanzhijun1@huawei.com>
|
|
Date: Mon, 24 Aug 2020 15:39:53 +0800
|
|
Subject: [PATCH] fix coredump when client -> active is NULL
|
|
|
|
---
|
|
client/dhclient.c | 37 +++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 37 insertions(+)
|
|
|
|
diff --git a/client/dhclient.c b/client/dhclient.c
|
|
index 2a17bfd..7581670 100644
|
|
--- a/client/dhclient.c
|
|
+++ b/client/dhclient.c
|
|
@@ -2059,6 +2059,24 @@ void state_bound (cpp)
|
|
struct data_string ds;
|
|
|
|
ASSERT_STATE(state, S_BOUND);
|
|
+ if (!client -> active)
|
|
+ {
|
|
+ struct timeval tv;
|
|
+
|
|
+ log_error ("No active lease in bound.");
|
|
+ script_init(client, "FAIL", (struct string_list *)0);
|
|
+ if (client -> alias)
|
|
+ script_write_params(client, "alias_", client -> alias);
|
|
+ script_go(client);
|
|
+ client -> state = S_INIT;
|
|
+ tv.tv_sec = cur_tv.tv_sec + ((client->config->retry_interval + 1) / 2 +
|
|
+ (random() % client->config->retry_interval));
|
|
+ tv.tv_usec = ((tv.tv_sec - cur_tv.tv_sec) > 1) ?
|
|
+ random() % 1000000 : cur_tv.tv_usec;
|
|
+ add_timeout(&tv, state_init, client, 0, 0);
|
|
+ detach ();
|
|
+ return;
|
|
+ }
|
|
|
|
/* T1 has expired. */
|
|
make_request (client, client -> active);
|
|
@@ -3173,6 +3191,25 @@ void send_request (cpp)
|
|
return;
|
|
}
|
|
|
|
+ if (!client -> active && client -> state != S_REQUESTING)
|
|
+ {
|
|
+ struct timeval tv;
|
|
+
|
|
+ log_error ("No active lease in request.");
|
|
+ script_init(client, "FAIL", (struct string_list *)0);
|
|
+ if (client -> alias)
|
|
+ script_write_params(client, "alias_", client -> alias);
|
|
+ script_go(client);
|
|
+ client -> state = S_INIT;
|
|
+ tv.tv_sec = cur_tv.tv_sec + ((client->config->retry_interval + 1) / 2 +
|
|
+ (random() % client->config->retry_interval));
|
|
+ tv.tv_usec = ((tv.tv_sec - cur_tv.tv_sec) > 1) ?
|
|
+ random() % 1000000 : cur_tv.tv_usec;
|
|
+ add_timeout(&tv, state_init, client, 0, 0);
|
|
+ detach ();
|
|
+ return;
|
|
+ }
|
|
+
|
|
/* If we're in the reboot state, make sure the media is set up
|
|
correctly. */
|
|
if (client -> state == S_REBOOTING &&
|
|
--
|
|
2.27.0
|
|
|