Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 09 Jun 2026 21:15:25 +0000
From:      bugzilla-noreply@freebsd.org
To:        freebsd-arm@FreeBSD.org
Subject:   [Bug 295965] wait3(&status, WNOHANG, ...) clobbers status to -65536 when no child exits.
Message-ID:  <bug-295965-7@https.bugs.freebsd.org/bugzilla/>

index | next in thread | raw e-mail

https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=295965

            Bug ID: 295965
           Summary: wait3(&status, WNOHANG, ...) clobbers status to -65536
                    when no child exits.
           Product: Base System
           Version: 15.1-RELEASE
          Hardware: arm
               URL: https://github.com/python/cpython/issues/151019#issuec
                    omment-4663777690
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: arm
          Assignee: freebsd-arm@FreeBSD.org
          Reporter: mandree@FreeBSD.org
                CC: arrowd@FreeBSD.org, python@FreeBSD.org

Created attachment 271653
  --> https://bugs.freebsd.org/bugzilla/attachment.cgi?id=271653&action=edit
test program to demonstrate ARMv7 wait3(WNOHANG) issue

Greetings,

we've been looking over various self-test failures in Python 3.15.0beta2 (in
ports) and on a particular system, and apparently FreeBSD 15.1-RC* clobber the
"status" field that we point wait3(...WNOHANG...) to when it doesn't have an
exited child to report the status of.  See URL.  The issue occurs in an ARMv7
poudriere jail hosted on Aarch64 on a Neoverse-N1 virtual server, and I can
reproduce it on Aarch64 with test code compiled with cc -m32.

int status = 0;
struct rusage ru; // uninit, will be cleared later if pid == 0
pid_t pid = wait3(&status, WNOHANG, &ru);

At this point, pid == 0 and status == -65536 on ARMv7 or with -m32, but not
Aarch64.
The latter is unexpected, and should be status = 0.

I am attaching a test program.

#0: It works on ARM64 and mostly everywhere else:
$ cc -std=c11 -o try try-wait3.c -O3 -Wall && ./try
pid = 0, status = 0 =        0

That's the expected outcome. wait3() has nothing to report, and leaves status
and ru alone.

#1: Now add -m32 to the command line:
$ cc -std=c11 -m32 -o try try-wait3.c -O3 -Wall && ./try
pid = 0, status = -65536 = 0xffff0000

=> OOPS.

To spice things up - truss "fixes" the status field but spoils the rusage
reporting:
$ truss ./try
fork()                                           = 58606 (0xe4ee)
freebsd32_wait4(-1,{ EXITED,val=0 },WNOHANG,{
u=0.000000,s=0.000000,in=4294958518,out=-39440684688344 }) = 0 (0x0)
freebsd32_fstat(1,{ mode=crw--w---- ,inode=108,size=0,blksize=4096 }) = 0 (0x0)
freebsd32_mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
= 537174016 (0x2004a000)
[...]
freebsd32_mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON|MAP_ALIGNED(12),-1,0x0)
= 537210880 (0x20053000)
freebsd32_ioctl(1,TIOCGETA,0xffffcf68)           = 0 (0x0)
pid = 0, status = 0 =        0
write(1,"pid = 0, status = 0 =        0\n",31)   = 31 (0x1f)
kill(58606,SIGTERM)                              = 0 (0x0)
_exit(0x0)                                      
process exit, rval = 0

The same happens if I set up an armv7 poudriere jail, enter it, and then
compile the test program there (with or without -m32 does not make a difference
obviously, the test fails every time unless run under truss).

-- 
You are receiving this mail because:
You are the assignee for the bug.

home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bug-295965-7>