sys_net: add missing range checks

This commit is contained in:
Megamouse 2021-08-08 00:42:02 +02:00
parent 0556837e3b
commit 430fd759fe
2 changed files with 50 additions and 24 deletions

View file

@ -598,7 +598,7 @@ struct nt_p2p_port
auto send_ack = [&]()
{
auto final_ack = sock.p2ps.data_beg_seq;
while (sock.p2ps.received_data.count(final_ack))
while (sock.p2ps.received_data.contains(final_ack))
{
final_ack += sock.p2ps.received_data.at(final_ack).size();
}
@ -840,7 +840,7 @@ struct nt_p2p_port
{
std::lock_guard lock(bound_p2p_vports_mutex);
if (bound_p2p_vports.count(dst_vport))
if (bound_p2p_vports.contains(dst_vport))
{
sys_net_sockaddr_in_p2p p2p_addr{};
@ -938,7 +938,7 @@ struct nt_p2p_port
{
std::lock_guard lock(bound_p2p_vports_mutex);
if (bound_p2p_streams.count(key_connected))
if (bound_p2p_streams.contains(key_connected))
{
const auto sock_id = bound_p2p_streams.at(key_connected);
sys_net.trace("Received packet for connected STREAM-P2P socket(s=%d)", sock_id);
@ -946,7 +946,7 @@ struct nt_p2p_port
return true;
}
if(bound_p2p_streams.count(key_listening))
if (bound_p2p_streams.contains(key_listening))
{
const auto sock_id = bound_p2p_streams.at(key_listening);
sys_net.trace("Received packet for listening STREAM-P2P socket(s=%d)", sock_id);
@ -1147,9 +1147,15 @@ s32 send_packet_from_p2p_port(const std::vector<u8>& data, const sockaddr_in& ad
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard list_lock(nc.list_p2p_ports_mutex);
auto& def_port = nc.list_p2p_ports.at(3658);
res = ::sendto(def_port.p2p_socket, reinterpret_cast<const char*>(data.data()), data.size(), 0, reinterpret_cast<const sockaddr*>(&addr), sizeof(sockaddr_in));
if (nc.list_p2p_ports.contains(3658))
{
auto& def_port = nc.list_p2p_ports.at(3658);
res = ::sendto(def_port.p2p_socket, reinterpret_cast<const char*>(data.data()), data.size(), 0, reinterpret_cast<const sockaddr*>(&addr), sizeof(sockaddr_in));
}
else
{
sys_net.error("send_packet_from_p2p_port: port %d not present", 3658);
}
}
return res;
@ -1161,11 +1167,18 @@ std::vector<std::vector<u8>> get_rpcn_msgs()
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard list_lock(nc.list_p2p_ports_mutex);
auto& def_port = nc.list_p2p_ports.at(3658);
if (nc.list_p2p_ports.contains(3658))
{
std::lock_guard lock(def_port.s_rpcn_mutex);
msgs = std::move(def_port.rpcn_msgs);
def_port.rpcn_msgs.clear();
auto& def_port = nc.list_p2p_ports.at(3658);
{
std::lock_guard lock(def_port.s_rpcn_mutex);
msgs = std::move(def_port.rpcn_msgs);
def_port.rpcn_msgs.clear();
}
}
else
{
sys_net.error("get_rpcn_msgs: port %d not present", 3658);
}
}
@ -1178,11 +1191,18 @@ std::vector<std::pair<std::pair<u32, u16>, std::vector<u8>>> get_sign_msgs()
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard list_lock(nc.list_p2p_ports_mutex);
auto& def_port = nc.list_p2p_ports.at(3658);
if (nc.list_p2p_ports.contains(3658))
{
std::lock_guard lock(def_port.s_sign_mutex);
msgs = std::move(def_port.sign_msgs);
def_port.sign_msgs.clear();
auto& def_port = nc.list_p2p_ports.at(3658);
{
std::lock_guard lock(def_port.s_sign_mutex);
msgs = std::move(def_port.sign_msgs);
def_port.sign_msgs.clear();
}
}
else
{
sys_net.error("get_sign_msgs: port %d not present", 3658);
}
}
@ -1489,7 +1509,7 @@ error_code sys_net_bnet_bind(ppu_thread& ppu, s32 s, vm::cptr<sys_net_sockaddr>
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard list_lock(nc.list_p2p_ports_mutex);
if (nc.list_p2p_ports.count(p2p_port) == 0)
if (!nc.list_p2p_ports.contains(p2p_port))
{
nc.list_p2p_ports.emplace(std::piecewise_construct, std::forward_as_tuple(p2p_port), std::forward_as_tuple(p2p_port));
}
@ -1606,7 +1626,7 @@ error_code sys_net_bnet_connect(ppu_thread& ppu, s32 s, vm::ptr<sys_net_sockaddr
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard list_lock(nc.list_p2p_ports_mutex);
if (!nc.list_p2p_ports.count(sock.p2p.port))
if (!nc.list_p2p_ports.contains(sock.p2p.port))
nc.list_p2p_ports.emplace(std::piecewise_construct, std::forward_as_tuple(sock.p2p.port), std::forward_as_tuple(sock.p2p.port));
auto& pport = nc.list_p2p_ports.at(sock.p2p.port);
@ -3145,6 +3165,7 @@ error_code sys_net_bnet_close(ppu_thread& ppu, s32 s)
auto& nc = g_fxo->get<network_context>();
{
std::lock_guard lock(nc.list_p2p_ports_mutex);
ensure(nc.list_p2p_ports.contains(sock->p2p.port));
auto& p2p_port = nc.list_p2p_ports.at(sock->p2p.port);
{
std::lock_guard lock(p2p_port.bound_p2p_vports_mutex);

View file

@ -495,8 +495,8 @@ std::shared_ptr<signaling_info> signaling_handler::get_signaling_ptr(const signa
if (!npid_to_conn_id.count(npid))
return nullptr;
auto conn_id = npid_to_conn_id.at(npid);
if (!sig1_peers.count(conn_id))
const u32 conn_id = npid_to_conn_id.at(npid);
if (!sig1_peers.contains(conn_id))
{
sign_log.error("Discrepancy in signaling 1 data");
return nullptr;
@ -508,7 +508,7 @@ std::shared_ptr<signaling_info> signaling_handler::get_signaling_ptr(const signa
// V2
auto room_id = sp->V2.room_id;
auto member_id = sp->V2.member_id;
if (!sig2_peers.count(room_id) || !sig2_peers.at(room_id).count(member_id))
if (!sig2_peers.contains(room_id) || !sig2_peers.at(room_id).contains(member_id))
return nullptr;
return sig2_peers.at(room_id).at(member_id);
@ -525,7 +525,8 @@ void signaling_handler::start_sig_nl(u32 conn_id, u32 addr, u16 port)
auto& sent_packet = sig1_packet;
sent_packet.command = signal_connect;
auto si = sig1_peers.at(conn_id);
ensure(sig1_peers.contains(conn_id));
std::shared_ptr<signaling_info> si = sig1_peers.at(conn_id);
si->addr = addr;
si->port = port;
@ -541,7 +542,11 @@ void signaling_handler::start_sig2(u64 room_id, u16 member_id)
auto& sent_packet = sig2_packet;
sent_packet.command = signal_connect;
auto si = sig2_peers.at(room_id).at(member_id);
ensure(sig2_peers.contains(room_id));
const auto& sp = sig2_peers.at(room_id);
ensure(sp.contains(member_id));
std::shared_ptr<signaling_info> si = sp.at(member_id);
send_signaling_packet(sent_packet, si->addr, si->port);
queue_signaling_packet(sent_packet, si, steady_clock::now() + REPEAT_CONNECT_DELAY);
@ -551,7 +556,7 @@ void signaling_handler::disconnect_sig2_users(u64 room_id)
{
std::lock_guard lock(data_mutex);
if (!sig2_peers.count(room_id))
if (!sig2_peers.contains(room_id))
return;
auto& sent_packet = sig2_packet;
@ -574,7 +579,7 @@ u32 signaling_handler::create_sig_infos(const SceNpId* npid)
ensure(npid->handle.data[16] == 0);
std::string npid_str(reinterpret_cast<const char*>(npid->handle.data));
if (npid_to_conn_id.count(npid_str))
if (npid_to_conn_id.contains(npid_str))
{
return npid_to_conn_id.at(npid_str);
}