summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Chan <jason.chan@mongodb.com>2020-01-25 02:13:38 +0000
committerevergreen <evergreen@mongodb.com>2020-01-25 02:13:38 +0000
commit27c44d402377e9b716d3106ef8fcca56dcb0de97 (patch)
tree6eb9828fd944473a284bb61bf18e140aa3bebff8
parent4748e2eb74ee89433affc78146e9d4c856529e00 (diff)
downloadmongo-27c44d402377e9b716d3106ef8fcca56dcb0de97.tar.gz
SERVER-45639 Use safeNumberLong() to parse wTimeout from command
-rw-r--r--src/mongo/db/write_concern_options.cpp2
-rw-r--r--src/mongo/db/write_concern_options_test.cpp22
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);