]> git.mxchange.org Git - flightgear.git/commitdiff
Make positioned queries more defensive.
authorJames Turner <zakalawe@mac.com>
Wed, 2 Oct 2013 21:28:19 +0000 (22:28 +0100)
committerJames Turner <zakalawe@mac.com>
Wed, 2 Oct 2013 21:28:19 +0000 (22:28 +0100)
Validate the filter type range, to avoid crashing on bad ranges.
Accept arbitrary type lists in the Nasal API for searching by distance

src/Navaids/positioned.cxx
src/Scripting/NasalPositioned_cppbind.cxx

index 51802c2ed281ddd4a63d6433eab64e2fa7816ed1..89d41475583e0a8e87a353e53dd592033b8bc836 100644 (file)
@@ -54,6 +54,16 @@ static void validateSGGeod(const SGGeod& geod)
   }
 }
 
+static bool validateFilter(FGPositioned::Filter* filter)
+{
+    if (filter->maxType() < filter->minType()) {
+        SG_LOG(SG_GENERAL, SG_WARN, "invalid positioned filter specified");
+        return false;
+    }
+    
+    return true;
+}
+
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -231,6 +241,10 @@ FGPositioned::findWithinRange(const SGGeod& aPos, double aRangeNm, Filter* aFilt
 {
   validateSGGeod(aPos);
 
+    if (!validateFilter(aFilter)) {
+        return FGPositionedList();
+    }
+    
   FGPositionedList result;
   Octree::findAllWithinRange(SGVec3d::fromGeod(aPos), 
     aRangeNm * SG_NM_TO_METER, aFilter, result, 0xffffff);
@@ -242,6 +256,10 @@ FGPositioned::findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter
 {
   validateSGGeod(aPos);
   
+    if (!validateFilter(aFilter)) {
+        return FGPositionedList();
+    }
+    
   int limitMsec = 32;
   FGPositionedList result;
   aPartial = Octree::findAllWithinRange(SGVec3d::fromGeod(aPos),
@@ -253,12 +271,20 @@ FGPositioned::findWithinRangePartial(const SGGeod& aPos, double aRangeNm, Filter
 FGPositionedList
 FGPositioned::findAllWithIdent(const std::string& aIdent, Filter* aFilter, bool aExact)
 {
+    if (!validateFilter(aFilter)) {
+        return FGPositionedList();
+    }
+    
   return NavDataCache::instance()->findAllWithIdent(aIdent, aFilter, aExact);
 }
 
 FGPositionedList
 FGPositioned::findAllWithName(const std::string& aName, Filter* aFilter, bool aExact)
 {
+    if (!validateFilter(aFilter)) {
+        return FGPositionedList();
+    }
+    
   return NavDataCache::instance()->findAllWithName(aName, aFilter, aExact);
 }
 
@@ -267,6 +293,10 @@ FGPositioned::findClosest(const SGGeod& aPos, double aCutoffNm, Filter* aFilter)
 {
   validateSGGeod(aPos);
   
+    if (!validateFilter(aFilter)) {
+        return NULL;
+    }
+    
   FGPositionedList l(findClosestN(aPos, 1, aCutoffNm, aFilter));
   if (l.empty()) {
     return NULL;
index eb9a14158b88e3e79890d775187bbb0c25ea560e..b2e10444224d0ed64dd6d9c2088acced0342e474 100644 (file)
@@ -395,13 +395,10 @@ static naRef f_findWithinRange(nasal::CallContext ctx)
 {
   SGGeod pos = getPosition(ctx);
   double range_nm = ctx.requireArg<double>(0);
-  
-    FGPositioned::Type ty = FGPositioned::typeFromName(ctx.getArg<std::string>(1));
-    if (ty == FGPositioned::INVALID)
-        naRuntimeError(ctx.c, "invalid filter type specification");
+
+    std::string typeSpec = ctx.getArg<std::string>(1);
+    FGPositioned::TypeFilter filter(FGPositioned::TypeFilter::fromString(typeSpec));
     
-  FGPositioned::TypeFilter filter(ty);
-  
   FGPositionedList items = FGPositioned::findWithinRange(pos, range_nm, &filter);
   FGPositioned::sortByRange(items, pos);
   return ctx.to_nasal(items);