Package: apache2 Version: 2.4.10-10+deb8u4 Severity: important Tags: patch Jessie's apache2 SysV init script has two errors which can cause restarts to fail or cause problems on shutdown.
Issue 1: Race condition in do_stop() and apache_wait_stop() The do_stop() functions issues an apache2ctl stop/graceful-stop (or a killproc) and calls apache_wait_stop() afterwards. apache_wait_stop() tries to gather the current apache2 PID via pidofproc from the pid file and afterwards checks, if the process has already terminated (via kill -0). This approach is problematic, because after receiving SIGTERM (via apache2ctl), apache2 will remove its PID file in the shutdown process. When reaching the pidofproc invocation in apache_wait_stop(), the PID file may have already been removed (by apache2) and the PID of the main apache process may not be determined (although the process may yet be actively running). In this case, apache_wait_stop() will wrongly return with 0, indicating that the process has been terminated successfully. In most cases, this is not problematic, because the apache2 process will terminate shortly after - however in case of restarts (which will call do_stop() -> do_start()) this may cause apache2 not being able to start up, because the old main process is still active and holding resources (like sockets/ports or possibly locks etc.). To resolve this, apache2ctl/killproc invocation should be done AFTER determining apaches main PID. Note that in Wheezys initscripts, this race condition was not present - this has been introduced with Jessie. Issue 2: Logical error in apache_wait_stop() When waiting for the main PID to terminate, apache_wait_stop() will check every second, if the process is dead. This is done for 60 seconds max, after that, the inner loop will break and presumably should set/return a statuscode of 2, which it does not, because 'break' is executed before setting the correct return code: if [ $i = '60' ]; then break STATUS=2 fi This might cause problems in case apache2 cannot be shut down correctly (for whatever reason). The following patch should fix the issues mentioned above: --- apache2.init.org 2015-10-24 10:37:19.000000000 +0200 +++ apache2.init 2016-04-21 14:43:22.380946637 +0200 @@ -139,6 +139,7 @@ apache_wait_stop() { local STATUS=$1 + local METH=$2 if [ $STATUS != 0 ] ; then return $STATUS @@ -146,11 +147,18 @@ PIDTMP=$(pidofproc -p $PIDFILE $DAEMON) if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then + + if [ "$METH" = "kill" ]; then + killproc -p $PIDFILE $DAEMON + else + $APACHE2CTL $METH > /dev/null 2>&1 + fi + local i=0 while kill -0 "${PIDTMP:-}" 2> /dev/null; do if [ $i = '60' ]; then + STATUS=2 break - STATUS=2 fi [ "$VERBOSE" != no ] && log_progress_msg "." sleep 1 @@ -223,15 +231,13 @@ fi if [ $AP_RET = 2 ] && apache_conftest ; then - $APACHE2CTL $STOP > /dev/null 2>&1 - apache_wait_stop $? + apache_wait_stop $? $STOP return $? else if [ $AP_RET = 2 ]; then - clear_error_msg + clear_error_msg APACHE2_INIT_MESSAGE="The apache2$DIR_SUFFIX configtest failed, so we are trying to kill it manually. This is almost certainly suboptimal, so please make sure your system is working as you'd expect now!" - killproc -p $PIDFILE $DAEMON - apache_wait_stop $? + apache_wait_stop $? "kill" return $? elif [ $AP_RET = 1 ] ; then APACHE2_INIT_MESSAGE="There are processes named 'apache2' running which do not match your pid file which are left untouched in the name of safety, Please review the situation by hand". -- Package-specific info: -- System Information: Debian Release: 8.4 APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-4-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages apache2 depends on: ii apache2-bin 2.4.10-10+deb8u4 ii apache2-data 2.4.10-10+deb8u4 ii apache2-utils 2.4.10-10+deb8u4 ii dpkg 1.17.26 ii lsb-base 4.1+Debian13+nmu1 ii mime-support 3.58 ii perl 5.20.2-3+deb8u4 ii procps 2:3.3.9-9 Versions of packages apache2 recommends: ii ssl-cert 1.0.35 Versions of packages apache2 suggests: pn apache2-doc <none> pn apache2-suexec-pristine | apache2-suexec-custom <none> pn www-browser <none> Versions of packages apache2-bin depends on: ii libapr1 1.5.1-3 ii libaprutil1 1.5.4-1 ii libaprutil1-dbd-sqlite3 1.5.4-1 ii libaprutil1-ldap 1.5.4-1 ii libc6 2.19-18+deb8u4 ii libldap-2.4-2 2.4.40+dfsg-1+deb8u2 ii liblua5.1-0 5.1.5-7.1 ii libpcre3 2:8.35-3.3+deb8u4 ii libssl1.0.0 1.0.1k-3+deb8u4 ii libxml2 2.9.1+dfsg1-5+deb8u1 ii perl 5.20.2-3+deb8u4 ii zlib1g 1:1.2.8.dfsg-2+b1 Versions of packages apache2-bin suggests: pn apache2-doc <none> pn apache2-suexec-pristine | apache2-suexec-custom <none> pn www-browser <none> Versions of packages apache2 is related to: ii apache2 2.4.10-10+deb8u4 ii apache2-bin 2.4.10-10+deb8u4 -- no debconf information