diff options
-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); |