Changeset - r25559:61b7771b3d5a
[Not reviewed]
master
0 1 0
Vít Šefl - 3 years ago 2021-05-17 20:32:30
vituscze@gmail.com
Fix: Do not send vehicles towards incomplete PF nodes

YAPF could end up in a situation where it sets the best intermediate node
to a node whose construction is never finalized (i.e. it is never added to
the open list). The content of the node would be overwritten in the next
round, potentially sending the vehicle to an unwanted location.
1 file changed with 5 insertions and 3 deletions:
0 comments (0 inline, 0 general)
src/pathfinder/yapf/yapf_base.hpp
Show inline comments
 
@@ -252,9 +252,9 @@ public:
 
			return;
 
		}
 

	
 
		if (m_max_search_nodes > 0 && (m_pBestIntermediateNode == nullptr || (m_pBestIntermediateNode->GetCostEstimate() - m_pBestIntermediateNode->GetCost()) > (n.GetCostEstimate() - n.GetCost()))) {
 
			m_pBestIntermediateNode = &n;
 
		}
 
		/* The new node can be set as the best intermediate node only once we're
 
		 * certain it will be finalized by being inserted into the open list. */
 
		bool set_intermediate = m_max_search_nodes > 0 && (m_pBestIntermediateNode == nullptr || (m_pBestIntermediateNode->GetCostEstimate() - m_pBestIntermediateNode->GetCost()) > (n.GetCostEstimate() - n.GetCost()));
 

	
 
		/* check new node against open list */
 
		Node *openNode = m_nodes.FindOpenNode(n.GetKey());
 
@@ -267,6 +267,7 @@ public:
 
				*openNode = n;
 
				/* add the updated old node back to open list */
 
				m_nodes.InsertOpenNode(*openNode);
 
				if (set_intermediate) m_pBestIntermediateNode = openNode;
 
			}
 
			return;
 
		}
 
@@ -292,6 +293,7 @@ public:
 
		/* the new node is really new
 
		 * add it to the open list */
 
		m_nodes.InsertOpenNode(n);
 
		if (set_intermediate) m_pBestIntermediateNode = &n;
 
	}
 

	
 
	const VehicleType * GetVehicle() const
0 comments (0 inline, 0 general)