diff options
author | Tyler Kaye <tyler.kaye@mongodb.com> | 2018-11-16 14:13:20 -0500 |
---|---|---|
committer | Tyler Kaye <tyler.kaye@mongodb.com> | 2018-11-20 11:29:02 -0500 |
commit | d75be58dd0dda5fe1190e8d48d91d6eda8e21acd (patch) | |
tree | 7f122dd97733ed1a70c3f377e1c2b224412bdae4 /src/mongo | |
parent | 1862b00862a6ea9c3fdd08bba52ea6a016eccbc5 (diff) | |
download | mongo-d75be58dd0dda5fe1190e8d48d91d6eda8e21acd.tar.gz |
SERVER-38178 - Fix bug with data_type_terminated that caused seg-faults on data_builder resizing
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/base/data_builder_test.cpp | 12 | ||||
-rw-r--r-- | src/mongo/base/data_type_terminated.h | 4 |
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; |