From 29e577d966ae48810507c7a016ff1489a5843b2c Mon Sep 17 00:00:00 2001 From: agalq13 <71724834+agalq13@users.noreply.github.com> Date: Thu, 11 Jun 2026 12:35:30 +0300 Subject: NetPlay: Validate controller packet indices --- Source/Core/Core/NetPlayServer.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index d26cc399c1..f37bc4200c 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -192,6 +192,12 @@ static void ClearPeerPlayerId(ENetPeer* peer) } } +template +static bool IsValidPadIndex(const T& map_array, PadIndex index) +{ + return index >= 0 && static_cast(index) < map_array.size(); +} + void NetPlayServer::SetupIndex() { if (!Config::Get(Config::NETPLAY_USE_INDEX) || Config::Get(Config::NETPLAY_INDEX_NAME).empty() || @@ -814,7 +820,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player) // If the data is not from the correct player, // then disconnect them. - if (m_pad_map.at(map) != player.pid) + if (!IsValidPadIndex(m_pad_map, map) || m_pad_map.at(map) != player.pid) { return 1; } @@ -862,6 +868,9 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player) PadIndex map; packet >> map; + if (!IsValidPadIndex(m_pad_map, map)) + return 1; + GCPadStatus pad; packet >> pad.button; spac << map << pad.button; @@ -895,7 +904,7 @@ unsigned int NetPlayServer::OnData(sf::Packet& packet, Client& player) // If the data is not from the correct player, // then disconnect them. - if (m_wiimote_map.at(map) != player.pid) + if (!IsValidPadIndex(m_wiimote_map, map) || m_wiimote_map.at(map) != player.pid) { return 1; } -- cgit v1.2.3 From 5585aa0474771040bdf1703cf33068e3991937a2 Mon Sep 17 00:00:00 2001 From: agalq13 <71724834+agalq13@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:31:05 +0300 Subject: NetPlay: Stop game when mapped Wii Remote disconnects --- Source/Core/Core/NetPlayServer.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Source/Core/Core/NetPlayServer.cpp b/Source/Core/Core/NetPlayServer.cpp index f37bc4200c..57cd691060 100644 --- a/Source/Core/Core/NetPlayServer.cpp +++ b/Source/Core/Core/NetPlayServer.cpp @@ -539,6 +539,21 @@ unsigned int NetPlayServer::OnDisconnect(const Client& player) break; } } + + for (PlayerId& mapping : m_wiimote_map) + { + if (m_is_running && mapping == pid && pid != 1) + { + std::lock_guard lkg(m_crit.game); + m_is_running = false; + + sf::Packet spac; + spac << MessageID::DisableGame; + // this thread doesn't need players lock + SendToClients(spac); + break; + } + } } if (m_start_pending) -- cgit v1.2.3