sys_net/P2P: Various fixes

Fix RTT adjustment
Fix possible dead pointer interaction in lv2_socket_native::recvfrom()
Fix iterator invalidation in nt_p2p_port::recv_data()
This commit is contained in:
RipleyTom
2026-02-20 05:15:49 +02:00
committed by Elad
parent b7b0e06a54
commit aaf84a8445
2 changed files with 10 additions and 5 deletions
@@ -112,7 +112,6 @@ public:
// reply is late, increases rtt
auto& msg = it->second;
const auto addr = msg.dst_addr.sin_addr.s_addr;
rtt_info rtt = rtts[msg.sock_id];
// Only increases rtt once per loop(in case a big number of packets are sent at once)
if (!rtt_increased.count(msg.sock_id))
@@ -120,7 +119,7 @@ public:
rtt.num_retries += 1;
// Increases current rtt by 10%
rtt.rtt_time += (rtt.rtt_time / 10);
rtts[addr] = rtt;
rtts[msg.sock_id] = rtt;
rtt_increased.emplace(msg.sock_id);
}
@@ -625,7 +624,7 @@ std::tuple<bool, s32, shared_ptr<lv2_socket>, sys_net_sockaddr> lv2_socket_p2ps:
sys_net_sockaddr ps3_addr{};
auto* paddr = reinterpret_cast<sys_net_sockaddr_in_p2p*>(&ps3_addr);
lv2_socket_p2ps* sock_client = reinterpret_cast<lv2_socket_p2ps*>(idm::check_unlocked<lv2_socket>(p2ps_client));
auto sock_client = static_cast<shared_ptr<lv2_socket_p2ps>>(idm::get_unlocked<lv2_socket>(p2ps_client));
{
std::lock_guard lock(sock_client->mutex);
paddr->sin_family = SYS_NET_AF_INET;
+8 -2
View File
@@ -249,8 +249,9 @@ bool nt_p2p_port::recv_data()
auto& bound_sockets = ::at32(bound_p2p_vports, dst_vport);
for (const auto sock_id : bound_sockets)
for (auto it = bound_sockets.begin(); it != bound_sockets.end();)
{
s32 sock_id = *it;
const auto sock = idm::check<lv2_socket>(sock_id, [&](lv2_socket& sock)
{
ensure(sock.get_type() == SYS_NET_SOCK_DGRAM_P2P);
@@ -262,12 +263,17 @@ bool nt_p2p_port::recv_data()
if (!sock)
{
sys_net.error("Socket %d found in bound_p2p_vports didn't exist!", sock_id);
bound_sockets.erase(sock_id);
it = bound_sockets.erase(it);
if (bound_sockets.empty())
{
bound_p2p_vports.erase(dst_vport);
break;
}
}
else
{
it++;
}
}
return true;