diff options
author | Jason Chan <jason.chan@mongodb.com> | 2020-01-25 02:13:38 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2020-01-25 02:13:38 +0000 |
commit | 27c44d402377e9b716d3106ef8fcca56dcb0de97 (patch) | |
tree | 6eb9828fd944473a284bb61bf18e140aa3bebff8 /src/mongo/db | |
parent | 4748e2eb74ee89433affc78146e9d4c856529e00 (diff) | |
download | mongo-27c44d402377e9b716d3106ef8fcca56dcb0de97.tar.gz |
SERVER-45639 Use safeNumberLong() to parse wTimeout from command
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/write_concern_options.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options_test.cpp | 22 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/mongo/db/write_concern_options.cpp b/src/mongo/db/write_concern_options.cpp index 0df85b5ed93..80e1c8bd0e4 100644 --- a/src/mongo/db/write_concern_options.cpp +++ b/src/mongo/db/write_concern_options.cpp @@ -122,7 +122,7 @@ StatusWith<WriteConcernOptions> WriteConcernOptions::parse(const BSONObj& obj) { wEl = e; writeConcern.usedDefault = false; } else if (fieldName == kWTimeoutFieldName) { - wTimeout = e.numberInt(); + wTimeout = e.safeNumberLong(); writeConcern.usedDefault = false; } else if (fieldName == kWElectionIdFieldName) { // Ignore. diff --git a/src/mongo/db/write_concern_options_test.cpp b/src/mongo/db/write_concern_options_test.cpp index 79c7c618a91..d99eaab2204 100644 --- a/src/mongo/db/write_concern_options_test.cpp +++ b/src/mongo/db/write_concern_options_test.cpp @@ -141,6 +141,28 @@ TEST(WriteConcernOptionsTest, ParseWTimeoutAsNumber) { ASSERT_EQUALS(123, options.wTimeout); } +TEST(WriteConcernOptionsTest, ParseWTimeoutAsNaNDouble) { + const double nan = std::nan("1"); + auto sw = WriteConcernOptions::parse(BSON("wtimeout" << nan)); + ASSERT_OK(sw.getStatus()); + WriteConcernOptions options = sw.getValue(); + ASSERT_TRUE(WriteConcernOptions::SyncMode::UNSET == options.syncMode); + ASSERT_EQUALS("", options.wMode); + ASSERT_EQUALS(1, options.wNumNodes); + ASSERT_EQUALS(0, options.wTimeout); +} + +TEST(WriteConcernOptionsTest, ParseWTimeoutAsDoubleLargerThanInt) { + // Set wtimeout to a double with value larger than INT_MAX. + auto sw = WriteConcernOptions::parse(BSON("wtimeout" << 2999999999.0)); + ASSERT_OK(sw.getStatus()); + WriteConcernOptions options = sw.getValue(); + ASSERT_TRUE(WriteConcernOptions::SyncMode::UNSET == options.syncMode); + ASSERT_EQUALS("", options.wMode); + ASSERT_EQUALS(1, options.wNumNodes); + ASSERT_LESS_THAN(options.wTimeout, 0); +} + TEST(WriteConcernOptionsTest, ParseReturnsFailedToParseOnUnknownField) { auto status = WriteConcernOptions::parse(BSON("x" << 123)).getStatus(); ASSERT_EQUALS(ErrorCodes::FailedToParse, status); |