severity 668416 serious tags 668416 +patch thanks Le 11.04.2012 19:59, Peter Eisentraut a écrit : > Somewhere between versions 3.2+Debian31 and 4.1+Debian0, the exit > status of the killproc function (/lib/lsb/init-functions) was changed > to return 3 when the program is not running. This is only correct > when a signal was specified; see > <http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html>: > > If called without a signal, it shall return 0 if the program has > been stopped or is not running and not 0 otherwise. If a signal is > given, it shall return 0 only if the program is running. > > This breaks init scripts that rely on this behavior; see for example > bug #667623. Hi Peter, and thanks for your bugreport. This seems serious enough to warrant RC severity IMHO, hence hereby rising severity. > Simple test: > > sudo bash > . /lib/lsb/init-functions > killproc /usr/bin/nonexistent > echo $? > > should print 0. It now prints 3. Attached is a proposed patch: as far as I can see, it does solve the problem pointed by this bugreport and does indeed work in the testcase you propose, but I'm not confident enough to claim it doesn't break anything else; would you mind to take a look? Cheers, OdyX
From 5cafecc339c585699b064a5c57149f6d367d7c8b Mon Sep 17 00:00:00 2001
From: Didier Raboud <odyx@debian.org>
Date: Thu, 12 Apr 2012 14:13:35 +0200
Subject: [PATCH] In killproc(), make sure to exit 0 when the program is not running and when no signal was specified.
Closes: #668416
Reported-by: Peter Eisentraut <petere@debian.org>
Signed-off-by: Didier Raboud <odyx@debian.org>
---
init-functions | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/init-functions b/init-functions
index 3be5648..9aa1db7 100644
--- a/init-functions
+++ b/init-functions
@@ -142,41 +142,41 @@ killproc () {
sig=$(echo ${2:-} | sed -e 's/^-\(.*\)/\1/')
sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/')
if [ "$sig" = 15 ] || [ "$sig" = TERM ]; then
is_term_sig="terminate_signal"
fi
status=0
if [ ! "$is_term_sig" ]; then
if [ -n "$sig" ]; then
/sbin/start-stop-daemon --stop --signal "$sig" \
--quiet $name_param || status="$?"
else
/sbin/start-stop-daemon --stop \
--retry 5 \
--quiet $name_param || status="$?"
fi
else
/sbin/start-stop-daemon --stop --quiet \
--oknodo $name_param || status="$?"
fi
if [ "$status" = 1 ]; then
- if [ -n "$sig" ]; then
+ if [ -z "$sig" ]; then
return 0
fi
return 3 # program is not running
fi
if [ "$status" = 0 ] && [ "$is_term_sig" ] && [ "$pidfile" ]; then
pidofproc -p "$pidfile" "$1" >/dev/null || rm -f "$pidfile"
fi
return 0
}
# Return LSB status
status_of_proc () {
local pidfile daemon name status
pidfile=
OPTIND=1
while getopts p: opt ; do
case "$opt" in
p) pidfile="$OPTARG";;
--
1.7.2.5
Attachment:
signature.asc
Description: OpenPGP digital signature