mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-28 13:28:01 +03: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;
|
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))
|
if (!idm::check<lv2_socket>(s))
|
||||||
{
|
{
|
||||||
return -SYS_NET_EBADF;
|
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));
|
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)
|
if (psa_in->sin_port == 53)
|
||||||
{
|
{
|
||||||
// Add socket to the dns hook list
|
// 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);
|
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));
|
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{};
|
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());
|
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
|
// Check if the packet is intercepted
|
||||||
if (ret_analyzer >= 0)
|
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;
|
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 network_clear_queue(ppu_thread& ppu)
|
||||||
{
|
{
|
||||||
s32 cleared = 0;
|
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_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);
|
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);
|
::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);
|
s32 network_clear_queue(ppu_thread& ppu);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue