diff --git a/src/mongo/db/geo/geoquery.cpp b/src/mongo/db/geo/geoquery.cpp index 916d9999aa140..9a3cdd157e8dd 100644 --- a/src/mongo/db/geo/geoquery.cpp +++ b/src/mongo/db/geo/geoquery.cpp @@ -43,7 +43,6 @@ namespace mongo { if (!obj["maxDistance"].eoo()) { uassert(17036, "maxDistance must be a number", obj["maxDistance"].isNumber()); double distArg = obj["maxDistance"].number(); - log() << "parseFromGeoNear got maxDistance " << distArg; uassert(16902, "maxDistance must be non-negative", distArg >= 0.0); if (fromRadians) { maxDistance = distArg * radius; @@ -51,7 +50,8 @@ namespace mongo { maxDistance = distArg; } - uassert(17037, "maxDistance too large", maxDistance <= M_PI * radius); + uassert(17037, "maxDistance too large", + maxDistance <= nextafter(M_PI * radius, DBL_MAX)); } return true; } @@ -98,7 +98,11 @@ namespace mongo { } } - double maxValidDistance = fromRadians ? M_PI : kRadiusOfEarthInMeters * M_PI; + // Add fudge to maxValidDistance so we don't throw when the provided maxDistance + // is on the edge. + double maxValidDistance = nextafter(fromRadians ? + M_PI : + kRadiusOfEarthInMeters * M_PI, DBL_MAX); uassert(17038, "$minDistance too large", minDistance < maxValidDistance); uassert(17039, "$maxDistance too large", diff --git a/src/mongo/db/index/2d_index_cursor.cpp b/src/mongo/db/index/2d_index_cursor.cpp index 3692688a2b259..c52e7b39c4682 100644 --- a/src/mongo/db/index/2d_index_cursor.cpp +++ b/src/mongo/db/index/2d_index_cursor.cpp @@ -1910,7 +1910,8 @@ namespace mongo { maxDistance = e.numberDouble(); uassert(16989, "$maxDistance must be non-negative", maxDistance >= 0); if (twod_internal::GEO_SPHERE == type) { - uassert(17088, "$maxDistance too large", maxDistance <= M_PI); + uassert(17088, "$maxDistance too large", + maxDistance <= nextafter(M_PI, DBL_MAX)); } } }