From 953be433013506d5542e6a5e0572c449a9b159fc Mon Sep 17 00:00:00 2001 From: Andreas Schmitt Date: Sun, 13 Jun 2021 22:28:13 +0200 Subject: [PATCH] Prevent numeric overflow --- src/road.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/road.cpp b/src/road.cpp index 74ec3c0230..1551453a66 100644 --- a/src/road.cpp +++ b/src/road.cpp @@ -783,6 +783,7 @@ void GeneratePublicRoads() auto main_network = make_shared(); main_network->towns.push_back(main_town); + main_network->failures_to_connect = 0; networks.push_back(main_network); town_to_network_map[main_town] = main_network; @@ -809,11 +810,13 @@ void GeneratePublicRoads() { found_path = FindPath(finder, start_town, end_town); } - auto num_visited_nodes = finder.closedlist_hash.size(); finder.Free(); if (found_path) { reachable_network->towns.push_back(start_town); + if (reachable_network->failures_to_connect > 0) { + reachable_network->failures_to_connect--; + } for (const TileIndex visited_town : _towns_visited_along_the_way) { town_to_network_map[visited_town] = reachable_network; @@ -839,11 +842,13 @@ void GeneratePublicRoads() { found_path = FindPath(finder, start_town, end_town); } - auto num_visited_nodes = finder.closedlist_hash.size(); finder.Free(); if (found_path) { network->towns.push_back(start_town); + if (network->failures_to_connect > 0) { + network->failures_to_connect--; + } town_to_network_map[start_town] = network; } else { network->failures_to_connect++; @@ -856,13 +861,14 @@ void GeneratePublicRoads() // We failed to connect to any network, so we are a separate network. Let future towns try to connect to us. auto new_network = make_shared(); new_network->towns.push_back(start_town); + new_network->failures_to_connect = 0; // We basically failed to connect to this many towns. int towns_already_in_networks = std::accumulate(networks.begin(), networks.end(), 0, [&](int accumulator, const std::shared_ptr &network) { return accumulator + static_cast(network->towns.size()); }); - new_network->failures_to_connect++; + new_network->failures_to_connect += towns_already_in_networks; town_to_network_map[start_town] = new_network; networks.push_back(new_network);