summaryrefslogtreecommitdiff
path: root/src/mongo/db/pipeline/window_function
diff options
context:
space:
mode:
authorNick Zolnierz <nicholas.zolnierz@mongodb.com>2021-03-29 08:41:08 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-03-29 15:45:30 +0000
commit57ea3472d0ce10032636872c00c944422d68046b (patch)
tree8e5d71c89ded2fea8e6edddaf352c9a6666ade51 /src/mongo/db/pipeline/window_function
parenta0904db4fb12ade7917759e9f9b7413ac2214a96 (diff)
downloadmongo-57ea3472d0ce10032636872c00c944422d68046b.tar.gz
SERVER-55480 Fix use-after-move in min max window functions
Diffstat (limited to 'src/mongo/db/pipeline/window_function')
-rw-r--r--src/mongo/db/pipeline/window_function/window_function_min_max.h2
-rw-r--r--src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp18
2 files changed, 19 insertions, 1 deletions
diff --git a/src/mongo/db/pipeline/window_function/window_function_min_max.h b/src/mongo/db/pipeline/window_function/window_function_min_max.h
index 65e64f304cd..e450caa6bc1 100644
--- a/src/mongo/db/pipeline/window_function/window_function_min_max.h
+++ b/src/mongo/db/pipeline/window_function/window_function_min_max.h
@@ -49,8 +49,8 @@ public:
}
void add(Value value) final {
- _values.insert(std::move(value));
_memUsageBytes += value.getApproximateSize();
+ _values.insert(std::move(value));
}
void remove(Value value) final {
diff --git a/src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp b/src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp
index 62102ef20c0..68a4cabe0de 100644
--- a/src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp
+++ b/src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp
@@ -133,5 +133,23 @@ TEST_F(WindowFunctionMinMaxTest, Ties) {
ASSERT_VALUE_EQ(max.getValue(), y);
}
+TEST_F(WindowFunctionMinMaxTest, TracksMemoryUsageOnAddAndRemove) {
+ size_t trackingSize = sizeof(WindowFunctionMin);
+ ASSERT_EQ(min.getApproximateSize(), trackingSize);
+
+ auto largeStr = Value{"this is quite a long string"_sd};
+ min.add(largeStr);
+ trackingSize += largeStr.getApproximateSize();
+ ASSERT_EQ(min.getApproximateSize(), trackingSize);
+
+ min.add(largeStr);
+ trackingSize += largeStr.getApproximateSize();
+ ASSERT_EQ(min.getApproximateSize(), trackingSize);
+
+ min.remove(largeStr);
+ trackingSize -= largeStr.getApproximateSize();
+ ASSERT_EQ(min.getApproximateSize(), trackingSize);
+}
+
} // namespace
} // namespace mongo