mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-21 12:05:23 +00:00
Add more disconnected limitations in sys_net
This commit is contained in:
parent
c0243a92d0
commit
737fbf661a
4 changed files with 34 additions and 7 deletions
|
@ -521,6 +521,12 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr
|
|||
return -SYS_NET_EINVAL;
|
||||
}
|
||||
|
||||
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);
|
||||
return -SYS_NET_EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
if (!idm::check<lv2_socket>(s))
|
||||
{
|
||||
return -SYS_NET_EBADF;
|
||||
|
|
|
@ -164,6 +164,12 @@ std::optional<s32> lv2_socket_native::connect(const sys_net_sockaddr& addr)
|
|||
|
||||
sys_net.notice("[Native] Attempting to connect on %s:%d", native_addr.sin_addr, std::bit_cast<be_t<u16>, u16>(native_addr.sin_port));
|
||||
|
||||
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
|
||||
if (!nph.get_net_status() && is_ip_public_address(native_addr))
|
||||
{
|
||||
return -SYS_NET_EADDRNOTAVAIL;
|
||||
}
|
||||
|
||||
if (psa_in->sin_port == 53)
|
||||
{
|
||||
// Add socket to the dns hook list
|
||||
|
@ -896,6 +902,12 @@ std::optional<s32> lv2_socket_native::sendto(s32 flags, const std::vector<u8>& b
|
|||
{
|
||||
native_addr = sys_net_addr_to_native_addr(*opt_sn_addr);
|
||||
sys_net.trace("[Native] Attempting to send to %s:%d", (*native_addr).sin_addr, std::bit_cast<be_t<u16>, u16>((*native_addr).sin_port));
|
||||
|
||||
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
|
||||
if (!nph.get_net_status() && is_ip_public_address(*native_addr))
|
||||
{
|
||||
return -SYS_NET_EADDRNOTAVAIL;
|
||||
}
|
||||
}
|
||||
|
||||
sys_net_error result{};
|
||||
|
@ -915,13 +927,6 @@ std::optional<s32> lv2_socket_native::sendto(s32 flags, const std::vector<u8>& b
|
|||
{
|
||||
const s32 ret_analyzer = dnshook.analyze_dns_packet(lv2_id, reinterpret_cast<const u8*>(buf.data()), buf.size());
|
||||
|
||||
// If we're offline return ENETDOWN for dns requests
|
||||
auto& nph = g_fxo->get<named_thread<np::np_handler>>();
|
||||
if (!nph.get_net_status())
|
||||
{
|
||||
return -SYS_NET_ENETDOWN;
|
||||
}
|
||||
|
||||
// Check if the packet is intercepted
|
||||
if (ret_analyzer >= 0)
|
||||
{
|
||||
|
|
|
@ -151,6 +151,21 @@ sys_net_sockaddr native_addr_to_sys_net_addr(const ::sockaddr_storage& native_ad
|
|||
return native_addr;
|
||||
}
|
||||
|
||||
bool is_ip_public_address(const ::sockaddr_in& addr)
|
||||
{
|
||||
const u8* ip = reinterpret_cast<const u8*>(&addr.sin_addr.s_addr);
|
||||
|
||||
if ((ip[0] == 10) ||
|
||||
(ip[0] == 127) ||
|
||||
(ip[0] == 172 && (ip[1] >= 16 && ip[1] <= 31)) ||
|
||||
(ip[0] == 192 && ip[1] == 168))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
s32 network_clear_queue(ppu_thread& ppu)
|
||||
{
|
||||
s32 cleared = 0;
|
||||
|
|
|
@ -21,6 +21,7 @@ int get_native_error();
|
|||
sys_net_error get_last_error(bool is_blocking, int native_error = 0);
|
||||
sys_net_sockaddr native_addr_to_sys_net_addr(const ::sockaddr_storage& native_addr);
|
||||
::sockaddr_in sys_net_addr_to_native_addr(const sys_net_sockaddr& sn_addr);
|
||||
bool is_ip_public_address(const ::sockaddr_in& addr);
|
||||
s32 network_clear_queue(ppu_thread& ppu);
|
||||
|
||||
#ifdef _WIN32
|
||||
|
|
Loading…
Add table
Reference in a new issue