diff options
author | Drew Paroski <drew.paroski@mongodb.com> | 2020-07-15 00:32:39 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-08-04 00:44:53 +0000 |
commit | e27e80ead0788c75103c6e10b888fd201bedb89c (patch) | |
tree | 6d904dd0ad6b2a455e3580f0c892b8fb28785d0e | |
parent | 3d9bdde82477bdda180993c435f29d41ca05e52f (diff) | |
download | mongo-e27e80ead0788c75103c6e10b888fd201bedb89c.tar.gz |
SERVER-49404 Enforce additional checks in $arrayToObject
(cherry picked from commit 1772b9a0393b55e6a280a35e8f0a1f75c014f301)
-rw-r--r-- | jstests/aggregation/expressions/arrayToObject.js | 24 | ||||
-rw-r--r-- | src/mongo/db/pipeline/expression.cpp | 16 |
2 files changed, 38 insertions, 2 deletions
diff --git a/jstests/aggregation/expressions/arrayToObject.js b/jstests/aggregation/expressions/arrayToObject.js index 114d69b7aaa..f21b32cda3f 100644 --- a/jstests/aggregation/expressions/arrayToObject.js +++ b/jstests/aggregation/expressions/arrayToObject.js @@ -74,4 +74,28 @@ assertPipelineErrors([{k: undefined, v: "undefinedKey"}], 40394); assertPipelineErrors([{y: "ignored", k: "item", v: "pear"}], 40392); assertPipelineErrors(NaN, 40386); + + // Check that $arrayToObject produces an error when the key contains a null byte. + assertErrorCode( + coll, + [{$replaceRoot: {newRoot: {$arrayToObject: {$literal: [["a\0b", "abra cadabra"]]}}}}], + 4940400); + assertErrorCode( + coll, + [{$replaceRoot: {newRoot: {$arrayToObject: {$literal: [{k: "a\0b", v: "blah"}]}}}}], + 4940401); + assertErrorCode( + coll, + [ + {$replaceRoot: {newRoot: {$arrayToObject: {$literal: [["a\0b", "abra cadabra"]]}}}}, + {$out: "output"} + ], + 4940400); + assertErrorCode( + coll, + [ + {$replaceRoot: {newRoot: {$arrayToObject: {$literal: [{k: "a\0b", v: "blah"}]}}}}, + {$out: "output"} + ], + 4940401); }()); diff --git a/src/mongo/db/pipeline/expression.cpp b/src/mongo/db/pipeline/expression.cpp index 1d7a9e3c159..304c0d302fe 100644 --- a/src/mongo/db/pipeline/expression.cpp +++ b/src/mongo/db/pipeline/expression.cpp @@ -639,7 +639,13 @@ Value ExpressionArrayToObject::evaluate(const Document& root, Variables* variabl << typeName(valArray[0].getType()), (valArray[0].getType() == BSONType::String)); - output[valArray[0].getString()] = valArray[1]; + auto keyName = valArray[0].getStringData(); + + uassert(4940400, + "Key field cannot contain an embedded null byte", + keyName.find('\0') == std::string::npos); + + output[keyName] = valArray[1]; } else { uassert( @@ -671,7 +677,13 @@ Value ExpressionArrayToObject::evaluate(const Document& root, Variables* variabl << typeName(key.getType()), (key.getType() == BSONType::String)); - output[key.getString()] = value; + auto keyName = key.getStringData(); + + uassert(4940401, + "Key field cannot contain an embedded null byte", + keyName.find('\0') == std::string::npos); + + output[keyName] = value; } } |