From 7399a3f1e9b362f0920d7ed1c2e9ac8977fef856 Mon Sep 17 00:00:00 2001 From: Eladash Date: Sun, 12 Apr 2020 11:38:04 +0300 Subject: [PATCH] sys_net: Fix sys_net_bnet_getpeername page faults + EINVAL checks --- rpcs3/Emu/Cell/lv2/sys_net.cpp | 56 +++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index c8012946ed..c87782bb33 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -752,40 +752,26 @@ error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr(s, [&](lv2_socket& sock) -> sys_net_error { std::lock_guard lock(sock.mutex); - ::sockaddr_storage native_addr; - ::socklen_t native_addrlen = sizeof(native_addr); + type = sock.type; if (::getpeername(sock.socket, reinterpret_cast(&native_addr), &native_addrlen) == 0) { verify(HERE), native_addr.ss_family == AF_INET; - vm::ptr paddr = vm::cast(addr.addr()); - - if (paddrlen) - { - *paddrlen = sizeof(sys_net_sockaddr_in); - } - - paddr->sin_len = sizeof(sys_net_sockaddr_in); - paddr->sin_family = SYS_NET_AF_INET; - paddr->sin_port = std::bit_cast, u16>(reinterpret_cast(&native_addr)->sin_port); - paddr->sin_addr = std::bit_cast, u32>(reinterpret_cast(&native_addr)->sin_addr.s_addr); - paddr->sin_zero = 0; - - if (sock.type == SYS_NET_SOCK_DGRAM_P2P) - { - vm::ptr paddr_p2p = vm::cast(addr.addr()); - paddr_p2p->sin_vport = paddr_p2p->sin_port - 3658; - paddr_p2p->sin_port = 3658; - struct in_addr rep; - rep.s_addr = htonl(paddr->sin_addr); - sys_net.error("Reporting P2P socket address as %s:%d:%d", rep, paddr_p2p->sin_port, paddr_p2p->sin_vport); - } - return {}; } @@ -802,6 +788,26 @@ error_code sys_net_bnet_getpeername(ppu_thread& ppu, s32 s, vm::ptr paddr = vm::cast(addr.addr()); + + paddr->sin_len = sizeof(sys_net_sockaddr_in); + paddr->sin_family = SYS_NET_AF_INET; + paddr->sin_port = std::bit_cast, u16>(reinterpret_cast(&native_addr)->sin_port); + paddr->sin_addr = std::bit_cast, u32>(reinterpret_cast(&native_addr)->sin_addr.s_addr); + paddr->sin_zero = 0; + + if (type == SYS_NET_SOCK_DGRAM_P2P) + { + vm::ptr paddr_p2p = vm::cast(addr.addr()); + paddr_p2p->sin_vport = paddr_p2p->sin_port - 3658; + paddr_p2p->sin_port = 3658; + struct in_addr rep; + rep.s_addr = htonl(paddr->sin_addr); + sys_net.error("Reporting P2P socket address as %s:%d:%d", rep, paddr_p2p->sin_port, paddr_p2p->sin_vport); + } + return CELL_OK; }