summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);