The branch main has been updated by des:

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

commit 080a4087014e1d19136cc77028019d98b5c69e1e
Author:     Dag-Erling Smørgrav <[email protected]>
AuthorDate: 2026-06-22 13:23:31 +0000
Commit:     Dag-Erling Smørgrav <[email protected]>
CommitDate: 2026-06-22 13:23:48 +0000

    tests: Fix race condition in aslr_setuid
    
    Use a cloexec pipe to block the parent until the child is ready.
    
    While here, redirect the output from ping to /dev/null, and mark the
    test as requiring the inet feature since we ping the IPv4 loopback.
    
    PR:             296116
    MFC after:      1 week
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D57734
---
 tests/sys/kern/Makefile |  1 +
 tests/sys/kern/aslr.c   | 16 +++++++++++++---
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/tests/sys/kern/Makefile b/tests/sys/kern/Makefile
index 3b09ee3181d2..728917b062c5 100644
--- a/tests/sys/kern/Makefile
+++ b/tests/sys/kern/Makefile
@@ -92,6 +92,7 @@ PROGS+=               coredump_phnum_helper
 PROGS+=                pdeathsig_helper
 PROGS+=                sendfile_helper
 
+CFLAGS.aslr+=                          -I${SRCTOP}/tests
 LIBADD.aslr+=                          util
 LIBADD.copy_file_range+=               md
 LIBADD.jail_lookup_root+=              jail util
diff --git a/tests/sys/kern/aslr.c b/tests/sys/kern/aslr.c
index 13038054603c..7d5282fc7cf3 100644
--- a/tests/sys/kern/aslr.c
+++ b/tests/sys/kern/aslr.c
@@ -11,6 +11,7 @@
 #include <sys/user.h>
 #include <sys/wait.h>
 
+#include <fcntl.h>
 #include <libutil.h>
 #include <pwd.h>
 #include <signal.h>
@@ -19,6 +20,7 @@
 #include <unistd.h>
 
 #include <atf-c.h>
+#include "freebsd_test_suite/macros.h"
 
 /*
  * Spawn an unprivileged child with ASLR force-disabled, which then execs
@@ -30,16 +32,21 @@ spawn_ping(const atf_tc_t *tc)
        const char *user;
        struct passwd *passwd;
        pid_t child;
-       int arg, error;
+       int arg, error, ctl[2];
+       char dummy;
 
        user = atf_tc_get_config_var(tc, "unprivileged_user");
        passwd = getpwnam(user);
        ATF_REQUIRE(passwd != NULL);
 
+       ATF_REQUIRE(pipe2(ctl, O_CLOEXEC) == 0);
        child = fork();
        ATF_REQUIRE(child >= 0);
        if (child == 0) {
-               if (seteuid(passwd->pw_uid) != 0)
+               if (close(ctl[0]) != 0 ||
+                   close(STDOUT_FILENO) != 0 ||
+                   open("/dev/null", O_WRONLY | O_APPEND) != STDOUT_FILENO ||
+                   seteuid(passwd->pw_uid) != 0)
                        _exit(1);
 
                arg = PROC_ASLR_FORCE_DISABLE;
@@ -50,7 +57,9 @@ spawn_ping(const atf_tc_t *tc)
                execl("/sbin/ping", "ping", "127.0.0.1", NULL);
                _exit(127);
        }
-       usleep(500000); /* XXX-MJ */
+       ATF_REQUIRE(close(ctl[1]) == 0);
+       ATF_REQUIRE(read(ctl[0], &dummy, 1) == 0);
+       ATF_REQUIRE(close(ctl[0]) == 0);
 
        return (child);
 }
@@ -98,6 +107,7 @@ ATF_TC_BODY(aslr_setuid, tc)
        pid_t child, pid;
        int arg, error, st;
 
+       ATF_REQUIRE_FEATURE("inet");
        if (!atf_tc_has_config_var(tc, "unprivileged_user"))
                atf_tc_skip("unprivileged_user not set");
 

Reply via email to