diff options
author | Nick Zolnierz <nicholas.zolnierz@mongodb.com> | 2021-03-29 08:41:08 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-03-29 15:45:30 +0000 |
commit | 57ea3472d0ce10032636872c00c944422d68046b (patch) | |
tree | 8e5d71c89ded2fea8e6edddaf352c9a6666ade51 /src/mongo/db/pipeline/window_function | |
parent | a0904db4fb12ade7917759e9f9b7413ac2214a96 (diff) | |
download | mongo-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.h | 2 | ||||
-rw-r--r-- | src/mongo/db/pipeline/window_function/window_function_min_max_test.cpp | 18 |
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 |