diff --git a/rpcs3/Emu/Cell/lv2/sys_net.cpp b/rpcs3/Emu/Cell/lv2/sys_net.cpp index 4997e27e33..c8012946ed 100644 --- a/rpcs3/Emu/Cell/lv2/sys_net.cpp +++ b/rpcs3/Emu/Cell/lv2/sys_net.cpp @@ -560,13 +560,35 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr(addr.addr()); + if (!addr || addrlen < addr.size()) + { + return -SYS_NET_EINVAL; + } + + struct + { + alignas(16) char buf[sizeof(sys_net_sockaddr)]; + bool changed = false; + } addr_buf; + + const auto psa_in = reinterpret_cast(addr_buf.buf); + const auto _addr = reinterpret_cast(addr_buf.buf); s32 result = 0; ::sockaddr_in name{}; name.sin_family = AF_INET; - name.sin_port = std::bit_cast(psa_in->sin_port); - name.sin_addr.s_addr = std::bit_cast(psa_in->sin_addr); + + if (idm::check(s)) + { + std::memcpy(addr_buf.buf, addr.get_ptr(), 16); + name.sin_port = std::bit_cast(psa_in->sin_port); + name.sin_addr.s_addr = std::bit_cast(psa_in->sin_addr); + } + else + { + return -SYS_NET_EBADF; + } + ::socklen_t namelen = sizeof(name); sys_net.warning("Attempting to connect on %s:%d", name.sin_addr, std::bit_cast, u16>(name.sin_port)); // ntohs(name.sin_port) @@ -575,7 +597,7 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptrsa_family == 0 && !psa_in->sin_port && !psa_in->sin_addr) + if (_addr->sa_family == 0 && !psa_in->sin_port && !psa_in->sin_addr) { const auto nph = g_fxo->get>(); @@ -587,13 +609,14 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptrsin_family = SYS_NET_AF_INET; psa_in->sin_port = 53; psa_in->sin_addr = nph->get_dns(); + addr_buf.changed = true; sys_net.warning("sys_net_bnet_connect: using DNS..."); nph->add_dns_spy(s); } - else if (addr->sa_family != SYS_NET_AF_INET) + else if (_addr->sa_family != SYS_NET_AF_INET) { - sys_net.error("sys_net_bnet_connect(s=%d): unsupported sa_family (%d)", s, addr->sa_family); + sys_net.error("sys_net_bnet_connect(s=%d): unsupported sa_family (%d)", s, _addr->sa_family); } if (::connect(sock.socket, reinterpret_cast(&name), namelen) == 0) @@ -682,6 +705,11 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr