]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[#123] dhclient no longer declines on client script crashes
authorThomas Markwalder <tmark@isc.org>
Mon, 3 Aug 2020 14:41:17 +0000 (10:41 -0400)
committerThomas Markwalder <tmark@isc.org>
Wed, 12 Jan 2022 13:29:51 +0000 (08:29 -0500)
modified:   RELNOTES
modified:   client/dhclient.c

RELNOTES
client/dhclient.c

index 7ed1f37da5eb7bc58e7b900372e896a50fb511bd..bbf815708361c99055850980f932a55f84c37b4a 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -115,6 +115,10 @@ and the client Linux script sample was updated.
 - Minor corrections to allow compilation under gcc 10.
   [Gitlab #117]
 
+- Corrected logic in dhclient that causes it to decline DHCPv4 leases if the
+  client script exits abnormally (i.e. crashes).
+  [Gitlab #123]
+
                Changes since 4.4.2b1 (Bug Fixes)
 
 - Added a clarification on DHCPINFORMs and server authority to
index 0a4fa312076cd2665380fef86c260a7834d4d2dd..e445a52d5d70d23e06b0c43b8cbeeab70bf7a2a9 100644 (file)
@@ -1635,9 +1635,12 @@ void bind_lease (client)
                script_write_params(client, "alias_", client->alias);
 
        /* If the BOUND/RENEW code detects another machine using the
-          offered address, it exits nonzero.  We need to send a
-          DHCPDECLINE and toss the lease. */
-       if (script_go(client)) {
+          offered address, then per our man page it should exit with
+       a non-zero status, to which we send a DHCPDECLINE and toss
+       the lease. A return value of less than zero indicates
+       the script crashed (e.g. segfault) which script_go will log
+       but we will ignore here. */
+       if (script_go(client) > 0)  {
                make_decline(client, client->new);
                send_decline(client);
                destroy_client_lease(client->new);
@@ -4557,8 +4560,14 @@ int script_go(struct client_state *client)
        }
        dfree (envp, MDL);
        gettimeofday(&cur_tv, NULL);
-       return (WIFEXITED (wstatus) ?
-               WEXITSTATUS (wstatus) : -WTERMSIG (wstatus));
+
+    if (!WIFEXITED(wstatus)) {
+        int sigval = WTERMSIG(wstatus);
+        log_error ("script_go script: %s was terminated by signal %d", scriptName, sigval);
+        return  (-sigval);
+    }
+
+    return (WEXITSTATUS(wstatus));
 }
 
 void client_envadd (struct client_state *client,