git: 35399f68c8e8 - main - safe_dot check file is a file

From: Simon J. Gerraty <sjg_at_FreeBSD.org>
Date: Fri, 16 Aug 2024 20:16:41 UTC
The branch main has been updated by sjg:

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

commit 35399f68c8e8a9b3bb4905057ca59766751766f3
Author:     Simon J. Gerraty <sjg@FreeBSD.org>
AuthorDate: 2024-08-16 20:15:20 +0000
Commit:     Simon J. Gerraty <sjg@FreeBSD.org>
CommitDate: 2024-08-16 20:15:20 +0000

    safe_dot check file is a file
    
    Since we are being paranoid, check that each arg to safe_dot is
    actually a file as well as non-empty.
    
    Check for white-space in filenames - these require special handling.
---
 libexec/rc/safe_eval.sh | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/libexec/rc/safe_eval.sh b/libexec/rc/safe_eval.sh
index 0e1410b771cb..d03eacbdff72 100644
--- a/libexec/rc/safe_eval.sh
+++ b/libexec/rc/safe_eval.sh
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: BSD-2-Clause
 
 # RCSid:
-#	$Id: safe_eval.sh,v 1.16 2024/08/15 02:28:30 sjg Exp $
+#	$Id: safe_eval.sh,v 1.20 2024/08/16 00:57:58 sjg Exp $
 #
 #	@(#) Copyright (c) 2023-2024 Simon J. Gerraty
 #
@@ -54,9 +54,10 @@ safe_eval_export() {
 # feed all "file" that exist to safe_eval
 #
 safe_dot() {
-    eval ${local:-:} ef ex f
+    eval ${local:-:} ef ex f rc
     ef=
     ex=
+    rc=1
     while :
     do
         case "$1" in
@@ -66,11 +67,20 @@ safe_dot() {
     done
     for f in "$@"
     do
-        test -s $f || continue
+        test -s "$f" -a -f "$f" || continue
+        : check for space or tab in "$f"
+        case "$f" in
+        *[[:space:]]*|*" "*|*"	"*) # we cannot do this efficiently
+            dotted="$dotted $f"
+            safe_eval$ex "$f"
+            rc=$?
+            continue
+            ;;
+        esac
         ef="${ef:+$ef }$f"
         dotted="$dotted $f"
     done
-    test -z "$ef" && return 1
+    test -z "$ef" && return $rc
     safe_eval$ex $ef
     return 0
 }