From d8a3f160efd8d9e824dfb6d30e0f6a9a0fd97e3a Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 14 Jan 2014 13:42:11 +0000 Subject: [PATCH] Bugfix: guard against corrupted airport XML. --- src/Airports/airport.cxx | 55 +++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 21 deletions(-) diff --git a/src/Airports/airport.cxx b/src/Airports/airport.cxx index 2b6020d9f..1a1fa7b1a 100644 --- a/src/Airports/airport.cxx +++ b/src/Airports/airport.cxx @@ -570,12 +570,16 @@ void FGAirport::loadSceneryDefinitions() const return; } - flightgear::NavDataCache::Transaction txn(cache); - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); - const_cast(this)->readThresholdData(rootNode); - cache->stampCacheFile(path); - txn.commit(); + try { + flightgear::NavDataCache::Transaction txn(cache); + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); + const_cast(this)->readThresholdData(rootNode); + cache->stampCacheFile(path); + txn.commit(); + } catch (sg_exception& e) { + SG_LOG(SG_NAVAID, SG_WARN, ident() << "loading threshold XML failed:" << e.getFormattedMessage()); + } } void FGAirport::readThresholdData(SGPropertyNode* aRoot) @@ -653,13 +657,17 @@ void FGAirport::validateTowerData() const // cached values are correct, we're all done return; } - - flightgear::NavDataCache::Transaction txn(cache); - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); - const_cast(this)->readTowerData(rootNode); - cache->stampCacheFile(path); - txn.commit(); + + try { + flightgear::NavDataCache::Transaction txn(cache); + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); + const_cast(this)->readTowerData(rootNode); + cache->stampCacheFile(path); + txn.commit(); + } catch (sg_exception& e){ + SG_LOG(SG_NAVAID, SG_WARN, ident() << "loading twr XML failed:" << e.getFormattedMessage()); + } } void FGAirport::readTowerData(SGPropertyNode* aRoot) @@ -706,16 +714,21 @@ bool FGAirport::validateILSData() return false; } - SGPropertyNode_ptr rootNode = new SGPropertyNode; - readProperties(path.str(), rootNode); + try { + SGPropertyNode_ptr rootNode = new SGPropertyNode; + readProperties(path.str(), rootNode); - flightgear::NavDataCache::Transaction txn(cache); - readILSData(rootNode); - cache->stampCacheFile(path); - txn.commit(); - + flightgear::NavDataCache::Transaction txn(cache); + readILSData(rootNode); + cache->stampCacheFile(path); + txn.commit(); // we loaded data, tell the caller it might need to reload things - return true; + return true; + } catch (sg_exception& e){ + SG_LOG(SG_NAVAID, SG_WARN, ident() << "loading ils XML failed:" << e.getFormattedMessage()); + } + + return false; } void FGAirport::readILSData(SGPropertyNode* aRoot)