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: <node index="5344" lat="N47 27.774559" lon="W122 18.465257" isOnRunway="1" holdPointType="PushBack" /> and then as: <node index="5344" lat="N47 27.725747" lon="W122 18.159649" isOnRunway="1" holdPointType="PushBack" /> (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.
This commit is contained in:
parent
caf3a4253d
commit
eefa9a75f9
1 changed files with 2 additions and 1 deletions
|
@ -292,7 +292,8 @@ bool FGAIFlightPlan::createTakeoffTaxi(FGAIAircraft * ac, bool firstFlight,
|
||||||
if ( runwayNode )
|
if ( runwayNode )
|
||||||
taxiRoute = gn->findShortestRoute(node, runwayNode);
|
taxiRoute = gn->findShortestRoute(node, runwayNode);
|
||||||
|
|
||||||
if (taxiRoute.empty()) {
|
// This may happen with buggy ground networks
|
||||||
|
if (taxiRoute.size() <= 1) {
|
||||||
createDefaultTakeoffTaxi(ac, apt, rwy);
|
createDefaultTakeoffTaxi(ac, apt, rwy);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue