On PS5 firmware 13.60 sceKernelGetEventError returns 0x80020000 plus the
event's fflags in 32 bits for every non-zero fflags, including values
above 0xFFFF, where it used to throw.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
guest_savedata_convert catches the runtime_error that the PRX raises for null arguments, so the target needs configure_windows_unwind like the other savedata targets that catch; without it the throw terminates the process on MinGW.
guest_savedata_delete catches the runtime_error that the PRX raises for null arguments, so the target needs configure_windows_unwind like the other savedata targets that catch; without it the throw terminates the process on MinGW.
A symbolic relocation with symbol index 0 read the name, binding and
type of dynamic symbol entry 0, so a named entry 0 turned STN_UNDEF
relocations into named imports on Linux, Windows and macOS. The ELF
gABI reserves index 0 as STN_UNDEF and requires its entry to be all
zero, and the guest reader already rejects such a table as "Invalid
null symbol". The relinker now fails with "Dynamic symbol table entry
0 is not a null symbol entry" when a symbolic relocation names index 0
and that entry has a nonzero byte; relocations against an all-zero
entry 0 are unchanged.
Console libSceLibcInternal exports o4kt51-uO48 as a 104-byte STT_OBJECT;
titles that resolve the symbol as data need a zeroed 13-slot vtable like the
other facet vtables, not a missing import.
On PS5 firmware 13.60 sceKernelGetProsperoSystemSwVersion and
sceKernelGetSystemSwVersion return 0 for every value in the leading size
field, keep it, write the string and the packed version, and return 0
without writing for a null block.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The pipeline read names at string offset 0 without checking the first
byte of DT_STRTAB, so DT_NEEDED 0 or an st_name of 0 named a library or
an import after the first string, and every target relinked it. The
gABI reserves index 0 of a string table for a NUL byte that means no
name, and GuestImageReader already rejects modules whose table breaks
this rule. Reading offset 0 from such a table now fails with "Dynamic
string table does not begin with a NUL byte" and writes no output.
SameImage subtracted each render output's surface address from its own
pixel buffer's pointer. Convert both to integers instead, check that the
update rectangle starting at that address lies inside the buffer, and
compare the offsets.
Culprit #7049; failing run 40193493248 (linux guest_kqueue aborted after 6 s inside VnodeOneshotWatchStops).
Watch threads of the previous test close their inotify fds after Stop(), so the baseline count could drop below the
final one and the exact equality never held.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Main's #10706 removes the local declarations at the top of libSceNet's
Export.cpp, where this branch had added __inet_pton and __inet_ntop.
libkernel's Api.hpp, which Export.cpp includes, now declares both, so the
merge takes main's side there.
The executable export loop accepted names that are empty after
stripping '#', IFUNC, FILE, COMMON and SECTION types, bindings above
STB_WEAK, st_other bits above the visibility, and same-name exports
that differ, and Linux copied them into .dynsym. It now rejects them
before the location checks with the rule GuestImageReader applies to
non-local guest symbols, while identical aliases stay accepted. Every
target reports the same line at the symbol entry offset, and the macOS
attribute and empty-name checks, now unreachable, are removed.
Main's #10706 moves the declarations of exported functions and their types
into the libraries' public headers, and gives WaitForPendingInSet a
KernelTimespec timeout. The merge keeps this branch's DeliverUnblockedPending
and ChangeBlockedMask with main's KernelTimespec. It takes main's side of
the declarations in GuestSignalSets.cpp, whose setjmp and longjmp this
branch had added and libc's Api.hpp now declares. GuestSignalHandlerMask.cpp
includes the libkernel and libc public headers in place of its own
declarations and GuestSignalSet and GuestSigaction types, as the
public_headers audit requires.
Forks inherit three jobs that cannot succeed there. Pages progress fails
on `gh api repos/<fork>/pages` (HTTP 404) after every push to main that
touches core/libs/prx, Pages fails at the release download or the
deployment, and the Build linux job waits for the self-hosted
`anyps5` runner, which forks don't have, until GitHub drops it. These
jobs now run only when the repository is not a fork.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
%G, %g and %V no longer throw for a negative tm_yday, a tm_yday past the year or a tm_wday below -6. They follow the year and week rule of the SDK libc.prx, read from its disassembly and checked by running it, with its leap-year test and 32-bit arithmetic. %U and %W also wrap in 32 bits as that module does.
Return NpGameIntentErrorInvalidArgument (0x80550004) instead of throwing APS5_INVALID_ARG_EX when invalid arguments are passed to sceNpGameIntentGetPropertyValueString or sceNpGameIntentReceiveIntent. Add regression test coverage in GuestNpGameIntent.
getitimer and setitimer(which != ITIMER_REAL, previous) copy the result
out through the checked write in Signals.cpp; the fault test only
exercised ITIMER_REAL. Add getitimer(ITIMER_VIRTUAL) and
setitimer(ITIMER_VIRTUAL, zero, previous) with an unmapped pointer
expecting EFAULT, and the matching calls with a valid pointer.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
The last branch of GuestCopyIn_nid_no_patch was a plain memcpy that
reported success, so an unreadable pointer on any other host ended the
process. Keep the null, overflow and zero-length guards and make exactly
one call to CopyGuestBytes, which reads with ReadProcessMemory,
process_vm_readv or mach_vm_read_overwrite and throws on a host without a
checked read. The per-platform branches are removed.
On Windows this replaces the VirtualQuery walk and memcpy with
ReadProcessMemory.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
agc_driver_linear_readback_label_off runs the label readback test with
APS5_NO_LABEL_READBACK_STORE=1 and expects it to fail, through WILL_FAIL.
It has no SKIP_RETURN_CODE, so WILL_FAIL also turns a skip (exit 77: no
device, an ANYPS5_GPU that matches nothing, or the stub build when
ANYPS5_AGC_EXECUTION_TESTS leaves the test out) and any other failure,
such as a device that cannot be created, into a pass.
It now skips on 77 like its sibling and passes only when the output
reports a texel read after the label that the dispatch before it did not
store, which is the failure the control is there to show.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
FreeBSD 11.4's kern_settimeofday rejects a timeval with a microsecond
field outside 0 to 999999 or a negative second field with EINVAL before
changing anything, sets the clock from a valid timeval, and then stores
the timezone, which gettimeofday reports. settimeofday now checks the
timeval the same way and throws for a valid one, as clock_settime does,
because the host clock is not changed. A timezone given without a
timeval is stored and gettimeofday reports it instead of 0 and 0.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Firmware 13.42's module checks a null result first (0x80550704) and
refuses a synchronous request in the lookup poll and wait with
0x80550307; the word filter keeps INVALID_ID. The debt entry records the
measurement and that IDs here do not carry the console's service bits.
Co-Authored-By: Claude Opus 5.5 <[email protected]>