git: be7839151cc9 - main - cp: Fix dead link case.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Sat, 10 May 2025 08:57:14 UTC
The branch main has been updated by des:

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

commit be7839151cc9e3dfc428933d5f2705b32cdf4b86
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2025-05-10 08:55:35 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2025-05-10 08:55:35 +0000

    cp: Fix dead link case.
    
    The test case was a) not doing what I intended it to do and b) missing
    a third possible configuration.  Fix the test case, and fix the code
    by not setting the beneath flag (which restricts operations to the
    destination tree) unless we are recursing.
    
    Fixes:          82fc0d09e862
    Sponsored by:   Klara, Inc.
    Reviewed by:    allanjude, markj
    Differential Revision:  https://reviews.freebsd.org/D50257
---
 bin/cp/cp.c             |  2 +-
 bin/cp/tests/cp_test.sh | 11 ++++++++---
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/bin/cp/cp.c b/bin/cp/cp.c
index f1cfde7e5008..a3c8d910639c 100644
--- a/bin/cp/cp.c
+++ b/bin/cp/cp.c
@@ -267,7 +267,7 @@ copy(char *argv[], enum op type, int fts_options, struct stat *root_stat)
 	char *recpath = NULL;
 	int atflags, dne, badcp, len, rval;
 	mode_t mask, mode;
-	bool beneath = type != FILE_TO_FILE;
+	bool beneath = Rflag && type != FILE_TO_FILE;
 	bool skipdp = false;
 
 	/*
diff --git a/bin/cp/tests/cp_test.sh b/bin/cp/tests/cp_test.sh
index 6644588f1ce8..bfc4009580cb 100755
--- a/bin/cp/tests/cp_test.sh
+++ b/bin/cp/tests/cp_test.sh
@@ -479,10 +479,15 @@ to_deadlink_append_body()
 	mkdir bar
 	ln -s baz bar/foo
 	atf_check cp foo bar
-	atf_check cmp -s foo bar/foo
-	rm -f bar/foo
+	atf_check cmp -s foo bar/baz
+	rm -f bar/foo bar/baz
+	ln -s baz bar/foo
+	atf_check cp foo bar/
+	atf_check cmp -s foo bar/baz
+	rm -f bar/foo bar/baz
+	ln -s $PWD/baz bar/foo
 	atf_check cp foo bar/
-	atf_check cmp -s foo bar/foo
+	atf_check cmp -s foo baz
 }
 
 atf_test_case to_dirlink