From 27c44d402377e9b716d3106ef8fcca56dcb0de97 Mon Sep 17 00:00:00 2001 From: Jason Chan Date: Sat, 25 Jan 2020 02:13:38 +0000 Subject: SERVER-45639 Use safeNumberLong() to parse wTimeout from command --- src/mongo/db/write_concern_options.cpp | 2 +- src/mongo/db/write_concern_options_test.cpp | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src/mongo/db') 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::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); -- cgit v1.2.1