From 36b736482aebae6b61b059dc4272241d5e2323cb Mon Sep 17 00:00:00 2001 From: lizzie Date: Fri, 31 Oct 2025 17:38:04 +0100 Subject: [PATCH] [network] Fix potential infinite hang when generating fake IPs (#2898) ALWAYS bound your loops :) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/2898 Reviewed-by: Caio Oliveira Reviewed-by: MaranBr Co-authored-by: lizzie Co-committed-by: lizzie --- src/network/room.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/network/room.cpp b/src/network/room.cpp index 1a3ad75d2b..ca3946b521 100644 --- a/src/network/room.cpp +++ b/src/network/room.cpp @@ -810,15 +810,16 @@ void Room::RoomImpl::BroadcastRoomInformation() { } IPv4Address Room::RoomImpl::GenerateFakeIPAddress() { - IPv4Address result_ip{192, 168, 0, 0}; - std::uniform_int_distribution<> dis(0x01, 0xFE); // Random byte between 1 and 0xFE - do { - for (std::size_t i = 2; i < result_ip.size(); ++i) { - result_ip[i] = static_cast(dis(random_gen)); + // An IP address is valid if it is not already taken by anybody else in the room. + std::lock_guard lock(member_mutex); + for (u8 i = 0x01; i < 0xFF; ++i) + for (u8 j = 0x01; j < 0xFF; ++j) { + IPv4Address addr{192, 168, i, j}; + if (std::all_of(members.begin(), members.end(), [&addr](auto const& member) { return member.fake_ip != addr; })) + return addr; } - } while (!IsValidFakeIPAddress(result_ip)); - - return result_ip; + LOG_ERROR(Network, "All addresses are taken"); + return IPv4Address{192, 168, 0, 0}; } void Room::RoomImpl::HandleProxyPacket(const ENetEvent* event) {