summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrew Paroski <drew.paroski@mongodb.com>2020-07-15 00:32:39 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-08-04 00:44:53 +0000
commite27e80ead0788c75103c6e10b888fd201bedb89c (patch)
tree6d904dd0ad6b2a455e3580f0c892b8fb28785d0e
parent3d9bdde82477bdda180993c435f29d41ca05e52f (diff)
downloadmongo-e27e80ead0788c75103c6e10b888fd201bedb89c.tar.gz
SERVER-49404 Enforce additional checks in $arrayToObject
(cherry picked from commit 1772b9a0393b55e6a280a35e8f0a1f75c014f301)
-rw-r--r--jstests/aggregation/expressions/arrayToObject.js24
-rw-r--r--src/mongo/db/pipeline/expression.cpp16
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;
}
}