Subject: pkg/31571: mail/dspam rc script can run too early, and it assumes dspam=YES
To: None <pkg-manager@netbsd.org, gnats-admin@netbsd.org,>
From: None <jbernard@mines.edu>
List: pkgsrc-bugs
Date: 10/12/2005 20:00:01
>Number:         31571
>Category:       pkg
>Synopsis:       mail/dspam rc script can run too early, and it assumes dspam=YES
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    pkg-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed Oct 12 20:00:00 +0000 2005
>Originator:     Jim Bernard
>Release:        NetBSD 3.99.9
>Organization:
>Environment:
System: NetBSD 3.99.9: Sat Sep 24 20:45:22 MDT 2005 i386
Architecture: i386
Machine: i386
>Description:
	There are two separate problems with the daemon startup script,
	dspam.sh:

	1) It is configured to be sorted by rcorder according to:

	     PROVIDE: dspam
	     BEFORE:  DAEMON

	   The result is that, if the script is located someplace other
	   than /etc/rc.d (e.g., /etc/pkg/rc.d or /usr/pkg/etc/rc.d), with
	   /etc/rc modified to search /etc/rc.d (first) and the second
	   directory for scripts, dspam is sorted to run prior to all other
	   startup scripts.  That is, its configuration does not pin down its
	   position in the execution sequence adequately, and its placement
	   in the list of arguments to rcorder can have a huge and undesirable
	   impact on its position in the execution sequence.

	2) There is a section at the end of the script that sets up the
	   pidfile if the script is executed with any arguments other
	   than "stop" or "status".  This section doesn't bother to check
	   whether the daemon is configured to run in /etc/rc.conf, so
	   it is executed even if rc.conf says "dspam=NO".

>How-To-Repeat:
	* Install mail/dspam, with the rc.d script placed in a location
	  separate from /etc/rc.d (e.g., via something like
	    RCD_SCRIPTS_DIR= ${PKG_SYSCONFBASEDIR}/rc.d
	  in /etc/mk.conf).  That location must be somewhere on the root
	  file system (e.g., /etc/pkg/rc.d).

	* Modify /etc/rc to search that other location as well as /etc/rc.d
	  for startup scripts.

	* Run rcorder to see what it produces.  E.g.:

	    rcorder -s nostart /etc/rc.d/* /etc/pkg/rc.d/*

	  and note that dspam is listed first.  This demonstrates the
	  first problem noted above.

	* Set dspam=NO in /etc/rc.conf and reboot.  Notice an error message
	  complaining that the pid file /var/run/dspam/dspam.pid cannot be
	  created, because of a missing directory.  This will be the first
	  message from the multiuser startup scripts.  I believe this is caused
	  by the combination of the two problems cited above.  dspam runs
	  first in the startup sequence, before /var is even mounted, and it
	  insists on trying to write the pid file, even if dspam=NO in rc.conf,
	  so that the daemon isn't executed.  (The missing piece to the
	  puzzle is that it seems like mkdir -p /var/run/dspam should create
	  the path even if /var isn't yet mounted, so it's not completely
	  clear why the missing-directory error occurs.  I haven't investigated
	  that further, but it seems clear that the problems noted above are
	  real and should be fixed.)
>Fix:
	I think it's probably best to run the daemon after SERVERS (which
	is where rcorder puts it if dspam is placed in /etc/rc.d), so
	I require that.  The patch to the pidfile section first checks the
	value of the rcvar "dspam".

--- dspam-dist	2005-10-11 12:37:51.000000000 -0600
+++ dspam	2005-10-12 12:16:44.000000000 -0600
@@ -2,10 +2,11 @@
 #
 # $NetBSD: dspam.sh,v 1.2 2005/04/26 15:43:26 jwise Exp $
 #
 
 # PROVIDE: dspam
+# REQUIRE: SERVERS
 # BEFORE:  DAEMON
 
 if [ -f /etc/rc.subr ]; then
 	. /etc/rc.subr
 fi
@@ -63,8 +64,8 @@
 		fi
 		;;
 		esac
 fi
 
-if [ "$1" != "stop" -o "$1" != "status" ]; then
+if checkyesno "${rcvar}" && [ "$1" != "stop" -o "$1" != "status" ]; then
 	echo $(check_process $command) > $pidfile
 fi