diff options
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/catalog/collection_options.cpp | 13 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_options_test.cpp | 18 |
2 files changed, 26 insertions, 5 deletions
diff --git a/src/mongo/db/catalog/collection_options.cpp b/src/mongo/db/catalog/collection_options.cpp index 786bffad84d..91cf5bbdc9d 100644 --- a/src/mongo/db/catalog/collection_options.cpp +++ b/src/mongo/db/catalog/collection_options.cpp @@ -86,6 +86,13 @@ Status checkStorageEngineOptions(const BSONElement& elem) { return Status::OK(); } +// These are collection creation options which are either created by other versions and no longer +// used, or handled elsewhere. If we encounter a field which CollectionOptions doesn't know about, +// parsing the options should fail unless we find the field name in this whitelist. +const std::set<StringData> collectionOptionsWhitelist{ + "create"_sd, "maxTimeMS"_sd, "writeConcern"_sd, +}; + } // namespace void CollectionOptions::reset() { @@ -245,11 +252,7 @@ Status CollectionOptions::parse(const BSONObj& options) { } pipeline = e.Obj().getOwned(); - } else if (fieldName == "writeConcern") { - continue; - } else if (fieldName == "maxTimeMS") { - continue; - } else { + } else if (collectionOptionsWhitelist.find(fieldName) == collectionOptionsWhitelist.end()) { return Status(ErrorCodes::InvalidOptions, str::stream() << "The field '" << fieldName << "' is not a valid collection option. Options: " diff --git a/src/mongo/db/catalog/collection_options_test.cpp b/src/mongo/db/catalog/collection_options_test.cpp index dd384f4d703..083d237ae19 100644 --- a/src/mongo/db/catalog/collection_options_test.cpp +++ b/src/mongo/db/catalog/collection_options_test.cpp @@ -269,4 +269,22 @@ TEST(CollectionOptions, UnknownTopLevelOptionFailsToParse) { ASSERT_NOT_OK(status); ASSERT_EQ(status.code(), ErrorCodes::InvalidOptions); } + +TEST(CollectionOptions, CreateWhitelistedOptionIgnored) { + CollectionOptions options; + auto status = options.parse(fromjson("{create: 1}")); + ASSERT_OK(status); +} + +TEST(CollectionOptions, MaxTimeMSWhitelistedOptionIgnored) { + CollectionOptions options; + auto status = options.parse(fromjson("{maxTimeMS: 1}")); + ASSERT_OK(status); +} + +TEST(CollectionOptions, WriteConcernWhitelistedOptionIgnored) { + CollectionOptions options; + auto status = options.parse(fromjson("{writeConcern: 1}")); + ASSERT_OK(status); +} } // namespace mongo |