git: f8b632fb046d - main - man.sh: avoid endless loop

From: Wolfram Schneider <wosch_at_FreeBSD.org>
Date: Mon, 21 Jul 2025 07:25:31 UTC
The branch main has been updated by wosch:

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

commit f8b632fb046de18f82705eddd5a11f91d54036df
Author:     Wolfram Schneider <wosch@FreeBSD.org>
AuthorDate: 2025-07-21 07:23:45 +0000
Commit:     Wolfram Schneider <wosch@FreeBSD.org>
CommitDate: 2025-07-21 07:23:45 +0000

    man.sh: avoid endless loop
    
    limit the number of .so includes to a value of 32 instead of infinity.
    
    PR: 287037
    Differential Revision: https://reviews.freebsd.org/D51412
---
 usr.bin/man/man.sh | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/usr.bin/man/man.sh b/usr.bin/man/man.sh
index ec20fc813bf4..18595042da5f 100755
--- a/usr.bin/man/man.sh
+++ b/usr.bin/man/man.sh
@@ -313,6 +313,8 @@ manpath_warnings() {
 # redirected to another source file.
 man_check_for_so() {
 	local IFS line tstr
+	local counter_so=0
+	local counter_so_limit=32
 
 	unset IFS
 	if [ -n "$catpage" ]; then
@@ -320,13 +322,16 @@ man_check_for_so() {
 	fi
 
 	# We need to loop to accommodate multiple .so directives.
-	while true
+	while [ $counter_so -lt $counter_so_limit ]
 	do
+		counter_so=$((counter_so + 1))
+
 		line=$($cattool "$manpage" 2>/dev/null | grep -E -m1 -v '^\.\\"[ ]*|^[ ]*$')
 		case "$line" in
                '.so /'*) break ;; # ignore absolute path
                '.so '*) trim "${line#.so}"
-			decho "$manpage includes $tstr"
+			decho "$manpage includes $tstri level=$counter_so"
+
 			# Glob and check for the file.
 			if ! check_man "$1/$tstr" ""; then
 				decho "  Unable to find $tstr"
@@ -337,6 +342,10 @@ man_check_for_so() {
 		esac
 	done
 
+	if [ $counter_so -ge $counter_so_limit ]; then
+		decho ".so include limit of $counter_so_limit reached, stop"
+	fi
+
 	return 0
 }