diff options
author | Waley Chen <waleycz@gmail.com> | 2016-03-07 11:30:52 -0500 |
---|---|---|
committer | Ramon Fernandez <ramon@mongodb.com> | 2016-03-29 17:37:01 -0400 |
commit | 36b4c60e7ccc96e3c05479136d264109d61a5339 (patch) | |
tree | 59d3c5342f31226a559d36136b0da377c4074f02 | |
parent | aa87323a825af440fe431ae82b1fc37adfd20e2c (diff) | |
download | mongo-36b4c60e7ccc96e3c05479136d264109d61a5339.tar.gz |
SERVER-22767 mongos segfault when invoking .explain() on certain operations
(cherry picked from commit cfa10de6e60b4eb0fbaa39d8d5e3a3774ad47b95)
-rw-r--r-- | jstests/noPassthrough/server22767.js | 21 | ||||
-rw-r--r-- | src/mongo/client/parallel.cpp | 10 |
2 files changed, 29 insertions, 2 deletions
diff --git a/jstests/noPassthrough/server22767.js b/jstests/noPassthrough/server22767.js new file mode 100644 index 00000000000..9b915ce0940 --- /dev/null +++ b/jstests/noPassthrough/server22767.js @@ -0,0 +1,21 @@ +// test that the mongos doesn't segfault when it receives malformed BSON +var st = new ShardingTest({shards:1}); +var testDB = st.getDB('test'); +testDB.test.insert({a:1}); + +try { + testDB.test.find({key: {$regex: 'abcd\0xyz'}}).explain(); +} catch (e) { + /* + * if the mongos segfaults, the error is the msg: + * "Error: error doing query: failed: network error while attempting to run command 'explain' on host '127.0.0.1:20014'" + * + * if the mongos doesn't segfault, the error is the object: + * "Error: explain failed: { + * "code" : 22, + * "ok" : 0, + * "errmsg" : "bson length doesn't match what we found in object with unknown _id" + * }" + */ + assert.eq(22, e.code); +}
\ No newline at end of file diff --git a/src/mongo/client/parallel.cpp b/src/mongo/client/parallel.cpp index 661156340bc..37de2506e0f 100644 --- a/src/mongo/client/parallel.cpp +++ b/src/mongo/client/parallel.cpp @@ -857,8 +857,14 @@ void ParallelSortClusteredCursor::finishInit(OperationContext* txn) { } throw; } else { - warning() << "db exception when finishing on " << shardId - << ", current connection state is " << mdata.toBSON() << causedBy(e); + // the InvalidBSON exception indicates that the BSON is malformed -> + // don't print/call "mdata.toBSON()" to avoid unexpected errors e.g. a segfault + if (e.getCode() == 22) + warning() << "bson is malformed :: db exception when finishing on " << shardId + << causedBy(e); + else + warning() << "db exception when finishing on " << shardId + << ", current connection state is " << mdata.toBSON() << causedBy(e); mdata.errored = true; throw; } |