summaryrefslogtreecommitdiff
path: root/src/mongo/db/geo
diff options
context:
space:
mode:
authorSiyuan Zhou <visualzhou@gmail.com>2015-03-09 20:31:11 -0400
committerSiyuan Zhou <visualzhou@gmail.com>2015-03-10 15:18:26 -0400
commit7083b5d3abeb7717c9c3c28a006b8f5544922c44 (patch)
treefca83e536d96d578bbedb9131e9968c2e33504fd /src/mongo/db/geo
parenteaa338b6668e0d7e1a9e1b7f20f04c2f33815d3c (diff)
downloadmongo-7083b5d3abeb7717c9c3c28a006b8f5544922c44.tar.gz
SERVER-17486 Crash when parsing invalid polygon coordinates
Diffstat (limited to 'src/mongo/db/geo')
-rw-r--r--src/mongo/db/geo/geoparser.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/mongo/db/geo/geoparser.cpp b/src/mongo/db/geo/geoparser.cpp
index db03fe66c12..8b8c3aebb63 100644
--- a/src/mongo/db/geo/geoparser.cpp
+++ b/src/mongo/db/geo/geoparser.cpp
@@ -144,9 +144,15 @@ namespace mongo {
}
static Status isLoopClosed(const vector<S2Point>& loop, const BSONElement loopElt) {
- if (loop.empty() || loop[0] != loop[loop.size() - 1])
- return BAD_VALUE("Loop is not closed: " << loopElt.toString(false));
- return Status::OK();
+ if (loop.empty()) {
+ return BAD_VALUE("Loop has no vertices: " << loopElt.toString(false));
+ }
+
+ if (loop[0] != loop[loop.size() - 1]) {
+ return BAD_VALUE("Loop is not closed: " << loopElt.toString(false));
+ }
+
+ return Status::OK();
}
static Status parseGeoJSONPolygonCoordinates(const BSONElement& elem, S2Polygon *out) {
@@ -173,6 +179,12 @@ namespace mongo {
// Drop the duplicated last point.
points.resize(points.size() - 1);
+ // At least 3 vertices.
+ if (points.size() < 3) {
+ return BAD_VALUE("Loop must have at least 3 different vertices: " <<
+ coordinateElt.toString(false));
+ }
+
S2Loop* loop = new S2Loop(points);
loops.push_back(loop);
@@ -269,6 +281,12 @@ namespace mongo {
// duplicate points
exteriorVertices.resize(exteriorVertices.size() - 1);
+ // At least 3 vertices.
+ if (exteriorVertices.size() < 3) {
+ return BAD_VALUE("Loop must have at least 3 different vertices: " <<
+ elem.toString(false));
+ }
+
auto_ptr<S2Loop> loop(new S2Loop(exteriorVertices));
// Check whether this loop is valid.
if (!loop->IsValid(&err)) {