git: 23e94b040b9b - main - pddupfd(2): add basic test

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Tue, 07 Jul 2026 23:28:28 UTC
The branch main has been updated by kib:

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

commit 23e94b040b9b99f097c113fc8576576ffec0486f
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-07-07 05:49:54 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-07-07 23:18:01 +0000

    pddupfd(2): add basic test
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D57163
---
 tests/sys/kern/procdesc.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/tests/sys/kern/procdesc.c b/tests/sys/kern/procdesc.c
index 388104054b82..541f15b49338 100644
--- a/tests/sys/kern/procdesc.c
+++ b/tests/sys/kern/procdesc.c
@@ -28,12 +28,14 @@
 
 #include <sys/types.h>
 #include <sys/capsicum.h>
+#include <sys/mman.h>
 #include <sys/resource.h>
 #include <sys/user.h>
 #include <sys/proc.h>
 #include <sys/procdesc.h>
 #include <sys/sysctl.h>
 #include <sys/wait.h>
+#include <machine/atomic.h>
 
 #include <errno.h>
 #include <fcntl.h>
@@ -657,6 +659,76 @@ ATF_TC_BODY(pdopenpid_no_wakeup, tc)
 	ATF_REQUIRE(close(fd) == 0);
 }
 
+/*
+ * basic pddupfd functionality
+ */
+
+#define	EXPECTED_OFFSET		123
+
+ATF_TC_WITHOUT_HEAD(pddupfd_basic);
+ATF_TC_BODY(pddupfd_basic, tc)
+{
+	int *comm;
+	struct __wrusage wu;
+	struct __siginfo si;
+	int fd, pp, rfd, status, workfd, r, r1;
+	off_t off;
+	pid_t child;
+
+	comm = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED |
+	    MAP_ANONYMOUS, -1, 0);
+	ATF_REQUIRE(comm != MAP_FAILED);
+	atomic_store_int(comm, -1);
+
+	child = fork();
+	ATF_REQUIRE(child != -1);
+	if (child == 0) {
+		workfd = open("/etc/passwd", O_RDONLY);
+		ATF_REQUIRE(workfd != -1);
+		atomic_store_int(comm, workfd);
+		while ((r = (int)atomic_load_int(comm)) >= 0)
+			sleep(1);
+		lseek(workfd, EXPECTED_OFFSET, SEEK_SET);
+		r -= 1;
+		atomic_store_int(comm, r);
+		while (r == (int)atomic_load_int(comm))
+			sleep(1);
+		_exit(0x23);
+	}
+
+	fd = pdopenpid(child, 0);
+	ATF_REQUIRE(fd != -1);
+	ATF_REQUIRE(pdgetpid(fd, &pp) == 0);
+
+	while ((rfd = (int)atomic_load_int(comm)) == -1)
+		;
+	ATF_REQUIRE(rfd >= 0);
+	workfd = pddupfd(fd, rfd, 0);
+	ATF_REQUIRE(workfd != -1);
+
+	/*
+	 * pddupfd-ed file must dup-ed, i.e. the underlying file must
+	 * be same between the remote and local filedescriptors.
+	 * Check that the initial seek offset is zero.  Then observe
+	 * the updated offset, which is only possible if the file is
+	 * indeed shared.
+	 */
+	off = lseek(workfd, 0, SEEK_CUR);
+	ATF_REQUIRE_EQ(off, 0);
+	r = -1;
+	atomic_store_int(comm, r);
+	while ((r1 = (int)atomic_load_int(comm)) == r)
+		sleep(1);
+	off = lseek(workfd, 0, SEEK_CUR);
+	ATF_REQUIRE_EQ(off, EXPECTED_OFFSET);
+	r1 -= 1;
+	atomic_store_int(comm, r1);
+	ATF_REQUIRE(close(workfd) == 0);
+
+	ATF_REQUIRE(pdwait(fd, &status, WEXITED, &wu, &si) != -1);
+	ATF_REQUIRE(close(fd) == 0);
+}
+
 ATF_TP_ADD_TCS(tp)
 {
 	ATF_TP_ADD_TC(tp, pid_recycle);
@@ -678,5 +750,7 @@ ATF_TP_ADD_TCS(tp)
 	ATF_TP_ADD_TC(tp, pdopenpid_exiting);
 	ATF_TP_ADD_TC(tp, pdopenpid_no_wakeup);
 
+	ATF_TP_ADD_TC(tp, pddupfd_basic);
+
 	return (atf_no_error());
 }