From eefa9a75f973abdf1c665d0c5ed07c2454c8d173 Mon Sep 17 00:00:00 2001 From: Florent Rougon Date: Fri, 14 Apr 2017 12:25:00 +0200 Subject: [PATCH] Fix crash in AI code when buggy groundnet declares pushback hold point on runway Some buggy *.groundnet.xml files (as KSEA currently on TS) define the pushback hold point for some parking positions as a node on a runway. In this case, this the pushback hold point for parking 'North_Cargo_Ramp', defined as node 5344 in Airports/K/S/E/KSEA.groundnet.xml, which is defined twice (second error), first as: and then as: (due to code in flightgear/src/Airports/dynamicloader.cxx, it should be the second one that wins, which is not on a runway but on apron in the north cargo area) As a consequence, when this gate is selected for an AI aircraft, the pushback route has only one node (since the pushback hold point is then the closest point to itself supposedly on runway!), and the corresponding FGTaxiRoute instance has an empty 'routes' member variable, which FGTaxiRoute::next() doesn't handle gracefully (segfault). It may be that an additional check/change could be desirable in FGTaxiRoute::next() in such a case (one node and obviously no route in the FGTaxiRoute instance), however I'm not sure how Durk wants this case to be handled, since FGTaxiRoute::next() seems to iterate on nodes. This fixes the bug reported at: https://forum.flightgear.org/viewtopic.php?p=308397#p308397 and https://sourceforge.net/p/flightgear/mailman/message/35776552/ Thanks to yanfiz and wkitty42 for the report, and to gooneybird for inspecting the groundnet file. --- src/AIModel/AIFlightPlanCreate.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AIModel/AIFlightPlanCreate.cxx b/src/AIModel/AIFlightPlanCreate.cxx index 4ce650170..f36c11a7d 100644 --- a/src/AIModel/AIFlightPlanCreate.cxx +++ b/src/AIModel/AIFlightPlanCreate.cxx @@ -292,7 +292,8 @@ bool FGAIFlightPlan::createTakeoffTaxi(FGAIAircraft * ac, bool firstFlight, if ( runwayNode ) taxiRoute = gn->findShortestRoute(node, runwayNode); - if (taxiRoute.empty()) { + // This may happen with buggy ground networks + if (taxiRoute.size() <= 1) { createDefaultTakeoffTaxi(ac, apt, rwy); return true; }