[pkg-dhcp-devel] Bug#692846: isc-dhcp-client: /sbin/dhclient-script incorrectly handles exit codes

Philipp Hahn hahn at univention.de
Fri Nov 9 17:54:08 UTC 2012


Package: isc-dhcp-client
Version: 4.2.4-3
Severity: important

/sbin/dhclient-script contains several logic bugs, which break proper handling of return codes.

Reading "man dhcp-scipts":
> HOOKS
>   ... It also invokes all executable scripts in ETCDIR/dhclient-enter-hooks.d/* in the same way.
>   ... If an error occurs during the execution of the script, it can set the exit_status variable to a nonzero value, and CLIENTBINDIR/dhclient-script will exit with that error code  immediately after the client script exits.

/sbin/dhclient-script:128
> run_hookdir() {
>     local dir
>     local exit_status
>     dir="$1"
>     shift	# See run_hook
> 
>     if [ -d "$dir" ]; then
>         for script in $(run-parts --list $dir); do
>             run_hook $script "$@" || true
By appending the "|| true" the exit status in now alyways 0
>             exit_status=$?
>         done
>     fi

/sbin/dhclient-script:149
>    if ! run_hook /etc/dhcp/dhclient-exit-hooks "$@"; then
>        exit_status=$?
exit_status will be alwys 0, since $? now contains the value of the "! runhook" status.


Please have a look at the upstream isc-dhcp-4.1.1-P1/client/scripts/linux
file or take a look at the following patch, which (hopefully) gets it right:
--- /sbin/dhclient-script	2012-10-15 21:03:17.000000000 +0200
+++ /home/phahn/dhclient-scipt	2012-11-08 23:22:45.449909285 +0100
@@ -109,36 +109,31 @@
 # run given script
 run_hook() {
     local script
-    local exit_status
+    local prev_exit_status
     script="$1"
+    prev_exit_status="$exit_status"
     shift	# discard the first argument, then the rest are the script's
 
     if [ -f $script ]; then
         . $script "$@"
     fi
 
-    if [ -n "$exit_status" ] && [ "$exit_status" -ne 0 ]; then
-        logger -p daemon.err "$script returned non-zero exit status $exit_status"
+    if [ "$exit_status" -ne "$prev_exit_status" ]; then
+        logger -p daemon.err "$script returned exit status $exit_status"
     fi
-
-    return $exit_status
 }
 
 # run scripts in given directory
 run_hookdir() {
     local dir
-    local exit_status
     dir="$1"
     shift	# See run_hook
 
     if [ -d "$dir" ]; then
         for script in $(run-parts --list $dir); do
-            run_hook $script "$@" || true
-            exit_status=$?
+            run_hook $script "$@"
         done
     fi
-
-    return $exit_status
 }
 
 # Must be used on exit.   Invokes the local dhcp client exit hooks, if any.
@@ -146,14 +141,10 @@
     exit_status=$1
 
     # Source the documented exit-hook script, if it exists
-    if ! run_hook /etc/dhcp/dhclient-exit-hooks "$@"; then
-        exit_status=$?
-    fi
+    run_hook /etc/dhcp/dhclient-exit-hooks "$@"
 
     # Now run scripts in the Debian-specific directory.
-    if ! run_hookdir /etc/dhcp/dhclient-exit-hooks.d "$@"; then
-        exit_status=$?
-    fi
+    run_hookdir /etc/dhcp/dhclient-exit-hooks.d "$@"
 
     exit $exit_status
 }
@@ -172,8 +163,12 @@
 # The action starts here
 
 # Invoke the local dhcp client enter hooks, if they exist.
+exit_status=0
 run_hook /etc/dhcp/dhclient-enter-hooks
 run_hookdir /etc/dhcp/dhclient-enter-hooks.d
+if [ $exit_status -ne 0 ]; then
+    exit $exit_status
+fi
 
 # Execute the operation
 case "$reason" in

-- System Information:
Debian Release: wheezy/sid
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-4-amd64 (SMP w/1 CPU core)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages isc-dhcp-client depends on:
ii  debianutils      4.3.4
ii  iproute          20120521-3
ii  isc-dhcp-common  4.2.4-3
ii  libc6            2.13-36

isc-dhcp-client recommends no packages.

Versions of packages isc-dhcp-client suggests:
pn  avahi-autoipd  <none>
pn  resolvconf     <none>

-- no debconf information



More information about the pkg-dhcp-devel mailing list