Skip to content

fix(libSceNet): match FreeBSD's inet_pton and socket errors on macOS - #9231

Open
Gonic0 wants to merge 2 commits into
boykopovar:mainfrom
Gonic0:fix/macos-sce-net-freebsd-errors
Open

Gonic0 wants to merge 2 commits into
boykopovar:mainfrom
Gonic0:fix/macos-sce-net-freebsd-errors

Conversation

@Gonic0

@Gonic0 Gonic0 commented Oct 21, 2026 •

Copy link
Copy Markdown

What

guest_sce_net aborts on macOS at two checks where XNU's sockets library differs from FreeBSD's:

  • sceNetInetPton(AF_INET, "01.2.3.4") must return 0 (GuestSceNet.cpp:786). FreeBSD's inet_pton refuses an IPv4 component with a leading zero; macOS's accepts it and returns 1.2.3.4. On macOS sceNetInetPton now refuses such a component before calling the host.
  • sceNetSocket(AF_INET, SOCK_STREAM, IPPROTO_UDP) must fail with EPROTONOSUPPORT (GuestSceNet.cpp:151). FreeBSD's socket reports EPROTONOSUPPORT for a protocol of another socket type; XNU reports EPROTOTYPE. sceNetSocket only passes the stream, datagram and raw types, which XNU supports with protocol 0, so on macOS a host EPROTOTYPE there becomes EPROTONOSUPPORT.

Both changes are inside #ifdef __APPLE__; Linux and Windows are unchanged.

Commits:

  1. The leading-zero check in sceNetInetPton.
  2. The EPROTOTYPE mapping in sceNetSocket.

No debt entry: the guest sees FreeBSD's results.

Precedents: libkernel already follows FreeBSD here on every host. Its inet_pton parses with FreeBSD's text rules (#3530), and its socket reports EPROTOTYPE only for a type inet does not have (#7151). sceNetInetPton and sceNetSocket still call the host, so this PR only covers the two places where macOS's host differs.

Overlap: #8658 carries the same two hunks among its 100 commits. This PR takes them on their own so they can be reviewed and merged separately; whichever lands second drops or rebases them.

Tested

macOS 27.2, Apple M5 Pro, Apple clang 21.0.0, x86-64 build under Rosetta 2, Release.

main does not build libSceNet's dependencies on macOS, so the tests ran in a local tree of main 53a0a27 with the community macOS stack merged, with this branch's Export.cpp changes applied on top (the same diff as this branch on main cecb540).

  • Host behaviour, from a small C program on the same machine: inet_pton(AF_INET, "01.2.3.4") returns 1; socket(AF_INET, SOCK_STREAM, IPPROTO_UDP), socket(AF_INET, SOCK_DGRAM, IPPROTO_TCP) and socket(AF_INET6, SOCK_STREAM, IPPROTO_UDP) fail with EPROTOTYPE (41); socket(AF_INET, SOCK_DGRAM, 99) fails with EPROTONOSUPPORT (43).
  • Without commit 1: guest_sce_net fails at GuestSceNet.cpp:786 and :787 for "01.2.3.4".
  • Without commit 2: guest_sce_net fails at GuestSceNet.cpp:151.
  • With both: no other check in guest_sce_net fails (checked with a non-aborting Require that prints the line), and ctest -R '^guest_sce_net$' passes 5 runs of 5.
  • Independently on an Apple M1, macOS 27.0.1, by @Mauro42K on feat: macOS host support (Apple Silicon via Rosetta 2, Vulkan on MoltenVK) #8658's e0a3ccec0 (comment): guest_sce_net passes 5/5 with both blocks and aborts with either one reverted.
  • tools/check_conventions.py --base upstream/main and git diff --check pass.

Not built on Linux or Windows; the changes are preprocessed out there.

Checklist

  • Based on current main; no other open PR implements the same functions (see Overlap above: feat: macOS host support (Apple Silicon via Rosetta 2, Vulkan on MoltenVK) #8658)
  • One topic per PR; follow-ups go in a new PR
  • No comments in code except technical debt
  • Unimplemented paths throw (NotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file
  • No notes, investigation .md files or images added to the repository (attach them to this PR)
  • New third-party code is a submodule built from source
  • Generic behaviour, not specific to one title
  • Depends on: none
  • Fixes: none
  • Unblocks: none
  • GPUs tested: n/a
  • AI-assisted: yes

🤖 Generated with Claude Code

Gonic0 and others added 2 commits October 21, 2026 12:52
FreeBSD's inet_pton refuses an IPv4 address with a component that has a
leading zero, such as "01.2.3.4", and guest_sce_net expects
sceNetInetPton to refuse it. macOS's inet_pton accepts it as 1.2.3.4, so
sceNetInetPton refuses it there before calling the host.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…et type on macOS

FreeBSD's socket fails with EPROTONOSUPPORT when the protocol belongs to
another socket type, such as IPPROTO_UDP for SOCK_STREAM, and
guest_sce_net expects that error from sceNetSocket. XNU fails with
EPROTOTYPE instead. sceNetSocket only passes the stream, datagram and raw
types, which XNU supports with protocol 0, so a host EPROTOTYPE there is
always a protocol of another type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Other open pull requests touch the same code. Merging one will break the other, or both implement the same thing. If this one builds on them, list them in Depends on.

Pull request Conflicting files (lines on main) Same exports Same new files
PR 8658 core/libs/prx/libSceNet/Export.cpp L977-978, L1951

Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.

Pull request Shared files not compared
PR 5836 core/libs/prx/libSceNet/Export.cpp
PR 7201 core/libs/prx/libSceNet/Export.cpp
PR 8254 core/libs/prx/libSceNet/Export.cpp

@EagleBearerYS

Copy link
Copy Markdown
Contributor

@Gonic0 a merge-order note: #9578 changes sceNetInetPton in the same Export.cpp. An AF_INET6 address now goes to libkernel's __inet_pton_nid_postfix, and an AF_INET address still goes to the host's inet_pton (InetPtonA on Windows). This PR's macOS check of an AF_INET address's leading zeros runs before that call, so with #9578 it still comes before the host parser. The two merge without a conflict in either order (git merge-tree of the two heads), so #9578 proposes that neither waits for the other. If you'd rather this one went first, say so and #9578 will list it under Depends on.

@Gonic0

Gonic0 commented Oct 22, 2026

Copy link
Copy Markdown
Author

Thanks @EagleBearerYS, agreed. I ran the same git merge-tree check against #9494 and #9578 and got the same result: no conflicts, and both #ifdef __APPLE__ blocks stay in place. Neither needs to wait, so no Depends on needed on either side.

AI-assisted: yes

This branch has not been deployed

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants