Skip to content

fix(libc): preserve invalid strerror error precedence - #2057

Closed
STUPIDCONTEM wants to merge 1 commit into
boykopovar:mainfrom
STUPIDCONTEM:fix/strerror-r-error-priority
Closed

STUPIDCONTEM wants to merge 1 commit into
boykopovar:mainfrom
STUPIDCONTEM:fix/strerror-r-error-priority

Conversation

@STUPIDCONTEM

@STUPIDCONTEM STUPIDCONTEM commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Evidence review (2026-10-09)

Game/title evidence has not been established. Validation below is host regression/build evidence only; it does not establish title compatibility. Older checked items and test results describe their stated revisions, not current merge readiness.

Game/title ID: none verified. No PS5 title execution is claimed.

What

strerror_r replaced EINVAL with ERANGE when the error number was unknown and the output buffer was also too short. Preserve EINVAL for unknown numbers, matching FreeBSD stable/11 strerror_r, which checks buffer truncation for valid error numbers only. Known errors still return ERANGE when their messages do not fit. Existing truncation, NUL termination, and errno preservation remain intact.

Tested

Windows 10 Pro 19045, WinLibs GCC 15.2.0 UCRT/posix/SEH r7, Ninja Release, BUILD_TESTING=ON, SPIRV-Tools disabled. Independent branch from f145139676a48306681d3a4d5fabf83938759daf.

  • New guest_strerror_r fails against unchanged upstream at short unknown buffer still returns EINVAL.
  • Regression covers known/unknown errors; negative, positive and extreme unknown numbers; ample, exact, short, one-byte and zero-byte buffers; NUL termination, adjacent sentinel bytes, and guest errno preservation.
  • Parent independently inspected the exact FreeBSD reference and reviewed the patch, then built and ran the regression in the full runtime.
  • Full default and explicit libs builds passed; full CTest: 489/489 passed, 31.78 s.
  • Committed-head conventions, whitespace and test-registration checks passed.

The separate regression leaves GuestErrors.cpp unchanged, avoiding the test-only change in #1712. #1729 uses strerror_r in syslog but does not change this implementation. Linux and PS5 hardware/titles were not run.

Checklist

  • Based on current main; no other open PR implements the same change (historical base; current readiness not asserted)
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw; no silent stubs added
  • No notes, investigation files or images added to the repository
  • New third-party code is a submodule built from source (none added)
  • Generic behaviour, not specific to one title
  • Depends on: none
  • AI-assisted: yes — OpenAI Codex agents assisted with implementation; the parent agent independently reviewed and tested the final change.

@MarcZX10 MarcZX10 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the complete diff and checked the cited FreeBSD stable/11 implementation: unknown error numbers keep EINVAL, while ERANGE is returned for truncation only on known errors. The new test covers precedence, truncation, NUL termination, sentinel safety, and guest errno. I built and ran the exact head on Linux with GCC 12; guest_strerror_r passed (1/1), and conventions/diff checks pass. Upstream has no check results for this fork head; the Windows full-suite evidence is reported in the PR description.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build libc needs rebase Conflicts with main, rebase needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants