From 44e8e2a630af0387b50fc455dab0c2755691ce95 Mon Sep 17 00:00:00 2001 From: Collecting Date: Thu, 22 Jan 2026 05:32:45 +0100 Subject: [PATCH] fix(multiplayer): Ensure Node = 1 and not 0 Signed-off-by: Collecting --- src/core/hle/service/ldn/lan_discovery.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/core/hle/service/ldn/lan_discovery.cpp b/src/core/hle/service/ldn/lan_discovery.cpp index 237f4ba0e..96790b109 100644 --- a/src/core/hle/service/ldn/lan_discovery.cpp +++ b/src/core/hle/service/ldn/lan_discovery.cpp @@ -77,16 +77,17 @@ void LANDiscovery::SetState(State new_state) { } Result LANDiscovery::GetNetworkInfo(NetworkInfo& out_network) const { + std::scoped_lock lock{packet_mutex}; if (state == State::AccessPointCreated || state == State::StationConnected) { std::memcpy(&out_network, &network_info, sizeof(network_info)); return ResultSuccess; } - return ResultBadState; } Result LANDiscovery::GetNetworkInfo(NetworkInfo& out_network, std::span out_updates) { + std::scoped_lock lock{packet_mutex}; if (out_updates.size() > NodeCountMax) { return ResultInvalidBufferCount; } @@ -376,7 +377,9 @@ void LANDiscovery::UpdateNodes() { } station.OverrideInfo(); } - network_info.ldn.node_count = count + 1; + + // Node Count Guard: Ensure we always report at least 1 node + network_info.ldn.node_count = std::max(1, count + 1); for (auto local_ip : connected_clients) { SendPacket(Network::LDNPacketType::SyncNetwork, network_info, local_ip); @@ -387,6 +390,7 @@ void LANDiscovery::UpdateNodes() { void LANDiscovery::OnSyncNetwork(const NetworkInfo& info) { network_info = info; + if (state == State::StationOpened) { SetState(State::StationConnected); } @@ -567,10 +571,20 @@ void LANDiscovery::ReceivePacket(const Network::LDNPacket& packet) { } case Network::LDNPacketType::SyncNetwork: { if (state == State::StationOpened || state == State::StationConnected) { - LOG_INFO(Frontend, "SyncNetwork packet received!"); + if (packet.data.size() < sizeof(NetworkInfo)) { + break; + } + NetworkInfo info{}; std::memcpy(&info, packet.data.data(), sizeof(NetworkInfo)); + if (state == State::StationConnected) { + if (std::memcmp(&info.network_id.session_id, &network_info.network_id.session_id, sizeof(SessionId)) != 0) { + break; + } + } + + LOG_INFO(Frontend, "SyncNetwork packet received!"); OnSyncNetwork(info); } else { LOG_INFO(Frontend, "SyncNetwork packet received but in wrong State!");