git: 356d0b79cf6f - main - rc.subr: Fix premature return from wait_for_pids

Dag-Erling Smørgrav <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src
Message-ID <6a673031.1f4b1.1984bdcc__46937.8581082978$1785147490$gmane$org@gitrepo.freebsd.org>
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=356d0b79cf6fc693ed1a5564232e240ce15ccb8a

commit 356d0b79cf6fc693ed1a5564232e240ce15ccb8a
Author:     Dag-Erling Smørgrav <[email protected]>
AuthorDate: 2026-07-27 10:15:47 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2026-07-27 10:15:47 +0000

    rc.subr: Fix premature return from wait_for_pids
    
    Use pwait's new -r option to wait until the target processes have not
    only terminated, but also been reaped.
    
    PR:             293183
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Sponsored by:   NetApp, Inc.
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D58391
---
 UPDATING                         | 12 ++++++++++++
 libexec/rc/rc.subr               |  4 ++--
 libexec/rc/tests/rc_subr_test.sh | 20 ++++++--------------
 3 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/UPDATING b/UPDATING
index e9ed0d97727a..442fcad7232e 100644
--- a/UPDATING
+++ b/UPDATING
@@ -27,6 +27,18 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 16.x IS SLOW:
 	world, or to merely disable the most expensive debugging functionality
 	at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
 
+20260722:
+	The wait_for_pids() function in rc.subr, used by rc scripts
+	when stopping or restarting a service, has been modified to
+	use pwait(1)'s new -r option, which requires kernel support.
+	When upgrading across this change, you should install a new
+	kernel first, then reboot, then install a new world, run
+	etcupdate, and reboot again.  Otherwise, you may find that
+	rc.subr is unable to stop services because the running kernel
+	does not provide the support that the updated pwait(1) needs.
+	Alternatively, if you deem it safe, you may use fastboot(8) to
+	reboot without shutting down services first.
+
 20260620:
 	On powerpc64le, long double is now IEEE 754 binary128 (quad
 	precision, 113-bit mantissa) instead of 64-bit double.  This is an
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index 7cb652e5ec17..0602178f42b4 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -803,7 +803,7 @@ sort_lite()
 #
 wait_for_pids()
 {
-	local _list _prefix _j
+	local _list= _prefix= _j=
 
 	for _j in "$@"; do
 		if kill -0 $_j 2>/dev/null; then
@@ -814,7 +814,7 @@ wait_for_pids()
 	while [ -n "$_list" ]; do
 		echo -n ${_prefix:-"Waiting for PIDS: "}$_list
 		_prefix=", "
-		_list=$(pwait -op $_list 2>/dev/null)
+		_list=$(pwait -opr $_list 2>/dev/null)
 	done
 	if [ -n "$_prefix" ]; then
 		echo "."
diff --git a/libexec/rc/tests/rc_subr_test.sh b/libexec/rc/tests/rc_subr_test.sh
index 9ddd13b61a7c..4754ad83c290 100644
--- a/libexec/rc/tests/rc_subr_test.sh
+++ b/libexec/rc/tests/rc_subr_test.sh
@@ -123,20 +123,12 @@ wait_for_pids_progress_head()
 }
 wait_for_pids_progress_body()
 {
-	cat >>script <<'EOF'
-. /etc/rc.subr
-sleep 15 &
-a=$!
-sleep 10 &
-b=$!
-sleep 5 &
-c=$!
-wait_for_pids $a $b $c
-EOF
-	re="^Waiting for PIDS: [0-9]+ [0-9]+ [0-9]+"
-	re="${re}, [0-9]+ [0-9]+"
-	re="${re}, [0-9]+\.$"
-	atf_check -s exit:0 -o match:"${re}" /bin/sh script
+	a=$(sleep 4 >/dev/null & echo $!)
+	b=$(sleep 3 >/dev/null & echo $!)
+	c=$(sleep 2 >/dev/null & echo $!)
+	atf_check \
+	    -o inline:"Waiting for PIDS: $a $b $c, $a $b, $a.\n" \
+	    /bin/sh -c ". /etc/rc.subr; wait_for_pids $a $b $c"
 }
 
 atf_init_test_cases()
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.