git: 7faddeb395b7 - main - rc: Fix scripts that need pathname expansion

From: Hiroki Sato <hrs_at_FreeBSD.org>
Date: Sat, 14 Jun 2025 20:26:40 UTC
The branch main has been updated by hrs:

URL: https://cgit.FreeBSD.org/src/commit/?id=7faddeb395b7976b44393db24f48ec47040eff07

commit 7faddeb395b7976b44393db24f48ec47040eff07
Author:     Hiroki Sato <hrs@FreeBSD.org>
AuthorDate: 2025-06-14 20:24:41 +0000
Commit:     Hiroki Sato <hrs@FreeBSD.org>
CommitDate: 2025-06-14 20:24:41 +0000

    rc: Fix scripts that need pathname expansion
    
    Reported by:    Kenneth Raplee
    Differential Revision:  https://reviews.freebsd.org/D45855
---
 libexec/rc/rc.d/moused  |  2 +-
 libexec/rc/rc.d/syscons |  4 ++--
 libexec/rc/rc.subr      | 24 ++++++++++++++++++++----
 3 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/libexec/rc/rc.d/moused b/libexec/rc/rc.d/moused
index 6f1b95af0f0a..9bb1a5cedc31 100755
--- a/libexec/rc/rc.d/moused
+++ b/libexec/rc/rc.d/moused
@@ -69,7 +69,7 @@ moused_start()
 		;;
 	esac
 
-	for ttyv in /dev/ttyv* ; do
+	for ttyv in $(expandpath "/dev/ttyv*"); do
 		vidcontrol < ${ttyv} ${mousechar_arg} -m on
 	done
 }
diff --git a/libexec/rc/rc.d/syscons b/libexec/rc/rc.d/syscons
index 325628a83d8c..7ad9b720e454 100755
--- a/libexec/rc/rc.d/syscons
+++ b/libexec/rc/rc.d/syscons
@@ -237,7 +237,7 @@ syscons_configure_keyboard()
 	if [ -n "${allscreens_kbdflags}" ]; then
 		sc_init
 		echo -n ' allscreens_kbd'
-		for ttyv in /dev/ttyv*; do
+		for ttyv in $(expandpath "/dev/ttyv*"); do
 			kbdcontrol ${allscreens_kbdflags} < ${ttyv} > ${ttyv} 2>&1
 		done
 	fi
@@ -381,7 +381,7 @@ syscons_start()
 	if [ -n "${allscreens_flags}" ]; then
 		sc_init
 		echo -n ' allscreens'
-		for ttyv in /dev/ttyv*; do
+		for ttyv in $(expandpath "/dev/ttyv*"); do
 			vidcontrol ${allscreens_flags} < ${ttyv} > ${ttyv} 2>&1
 		done
 	fi
diff --git a/libexec/rc/rc.subr b/libexec/rc/rc.subr
index 359eebd1d342..d760b75a15a3 100644
--- a/libexec/rc/rc.subr
+++ b/libexec/rc/rc.subr
@@ -223,10 +223,11 @@ rc_trace()
 list_vars()
 {
 	# Localize 'set' option below.
-	local -
+	local - _s
 	local IFS=$'\n' line varname
 
-	# Disable path expansion in unquoted 'for' parameters below.
+	# Disable path expansion temporarily in unquoted 'for' parameters below.
+	_s=$(set +o)
 	set -o noglob
 
 	for line in $(set); do
@@ -241,6 +242,7 @@ list_vars()
 			;;
 		esac
 	done
+	eval $_s
 }
 
 # set_rcvar [var] [defval] [desc]
@@ -292,6 +294,19 @@ set_rcvar_obsolete()
 	eval ${_var}_obsolete_msg=\"$*\"
 }
 
+# expandpath str
+#	Apply pathname expansion to str.
+#
+expandpath()
+{
+	local _s
+
+	_s=$(set +o)
+	set +o noglob
+	echo $1
+	eval $_s
+}
+
 #
 # force_depend script [rcvar]
 #	Force a service to start. Intended for use by services
@@ -1783,18 +1798,19 @@ _run_rc_setup()
 
 _run_rc_doit()
 {
-	local _m
+	local _m _s
 
 	debug "run_rc_command: doit: $*"
 	_m=$(umask)
 	${_umask:+umask ${_umask}}
 
 	# Disable pathname expansion temporarily for run_rc_command. 
+	_s=$(set +o)
 	set -o noglob
 	eval "$@"
-	set +o noglob
 	_return=$?
 	umask ${_m}
+	eval $_s
 
 	# If command failed and force isn't set, request exit.
 	if [ $_return -ne 0 ] && [ -z "$rc_force" ]; then