From: Thomas Markwalder Date: Mon, 3 Aug 2020 14:41:17 +0000 (-0400) Subject: [#123] dhclient no longer declines on client script crashes X-Git-Tag: v4_4_3b1^2~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=33e517615f8467a005de2ca2633f52bad323ec2b;p=thirdparty%2Fdhcp.git [#123] dhclient no longer declines on client script crashes modified: RELNOTES modified: client/dhclient.c --- diff --git a/RELNOTES b/RELNOTES index 7ed1f37d..bbf81570 100644 --- 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 diff --git a/client/dhclient.c b/client/dhclient.c index 0a4fa312..e445a52d 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -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,