summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTyler Kaye <tyler.kaye@mongodb.com>2018-11-16 14:13:20 -0500
committerTyler Kaye <tyler.kaye@mongodb.com>2018-11-20 11:29:02 -0500
commitd75be58dd0dda5fe1190e8d48d91d6eda8e21acd (patch)
tree7f122dd97733ed1a70c3f377e1c2b224412bdae4
parent1862b00862a6ea9c3fdd08bba52ea6a016eccbc5 (diff)
downloadmongo-d75be58dd0dda5fe1190e8d48d91d6eda8e21acd.tar.gz
SERVER-38178 - Fix bug with data_type_terminated that caused seg-faults on data_builder resizing
-rw-r--r--src/mongo/base/data_builder_test.cpp12
-rw-r--r--src/mongo/base/data_type_terminated.h4
2 files changed, 15 insertions, 1 deletions
diff --git a/src/mongo/base/data_builder_test.cpp b/src/mongo/base/data_builder_test.cpp
index 6b7e0655f61..d497e78622e 100644
--- a/src/mongo/base/data_builder_test.cpp
+++ b/src/mongo/base/data_builder_test.cpp
@@ -29,6 +29,7 @@
*/
#include "mongo/base/data_builder.h"
+#include "mongo/base/data_type_terminated.h"
#include "mongo/platform/endian.h"
#include "mongo/unittest/unittest.h"
@@ -169,4 +170,15 @@ TEST(DataBuilder, Move) {
ASSERT(!db.getCursor().data());
}
+TEST(DataBuilder, TerminatedStringDatas) {
+ DataBuilder db{10};
+ StringData sample{"abcdefgh"};
+
+ auto status2 = db.writeAndAdvance<Terminated<'\0', StringData>>(sample);
+ ASSERT_EQUALS(true, status2.isOK());
+
+ auto status3 = db.writeAndAdvance<Terminated<'\0', StringData>>(sample);
+ ASSERT_EQUALS(true, status3.isOK());
+}
+
} // namespace mongo
diff --git a/src/mongo/base/data_type_terminated.h b/src/mongo/base/data_type_terminated.h
index b16bc6ae30d..cfe00236b83 100644
--- a/src/mongo/base/data_type_terminated.h
+++ b/src/mongo/base/data_type_terminated.h
@@ -109,7 +109,9 @@ struct DataType::Handler<Terminated<C, T>> {
return TerminatedHelper::makeStoreStatus(C, length, debug_offset + local_advanced);
}
- ptr[local_advanced] = C;
+ if (ptr) {
+ ptr[local_advanced] = C;
+ }
if (advanced) {
*advanced = local_advanced + 1;