From 23489568db3cbb32f1be8c88fb02fab316fd1b28 Mon Sep 17 00:00:00 2001 From: jackpoz Date: Wed, 6 Feb 2019 19:32:31 +0100 Subject: Core/MMaps: Fix infinite loop in Detour Fix an infinite loop in Detour happening in Dalaran Sewers. This is more of an emergency patch until we figure out why dtNodes have a circular reference (A -> B -> C -> A) happening quite often in this place (cherry picked from commit c8ec2dd95d07e3eec00027cdb9605529a49d6475) --- dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'dep/recastnavigation') diff --git a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp index 4e69fcbcc53..8af14858f51 100644 --- a/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp +++ b/dep/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp @@ -26,6 +26,7 @@ #include "DetourAlloc.h" #include "DetourAssert.h" #include +#include /// @class dtQueryFilter /// @@ -1206,10 +1207,16 @@ dtStatus dtNavMeshQuery::getPathToNode(dtNode* endNode, dtPolyRef* path, int* pa // Find the length of the entire path. dtNode* curNode = endNode; int length = 0; + std::unordered_set processedIds; + bool alreadyProcessed = false; do { length++; + alreadyProcessed = !processedIds.insert(curNode->pidx).second; + if (alreadyProcessed) + return DT_FAILURE; curNode = m_nodePool->getNodeAtIdx(curNode->pidx); + } while (curNode); // If the path cannot be fully stored then advance to the last node we will be able to store. -- cgit v1.2.3