Add more disconnected limitations in sys_net

This commit is contained in:
RipleyTom 2023-01-31 03:36:02 +01:00 committed by Megamouse
parent c0243a92d0
commit 737fbf661a
4 changed files with 34 additions and 7 deletions

View file

@ -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;

View file

@ -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)
{

View file

@ -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;

View file

@ -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