2121
2222#include < unordered_map>
2323
24+ #include < MemoryLocal.h>
2425#include < android-base/file.h>
2526#include < gtest/gtest.h>
2627#include < unwindstack/MapInfo.h>
@@ -109,23 +110,23 @@ TEST(DexFileTest, from_memory_fail_too_small_for_header) {
109110
110111 memory.SetMemory (0x1000 , kDexData , 10 );
111112
112- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) == nullptr );
113+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) == nullptr );
113114}
114115
115116TEST (DexFileTest, from_memory_fail_too_small_for_data) {
116117 MemoryFake memory;
117118
118119 memory.SetMemory (0x1000 , kDexData , sizeof (kDexData ) - 2 );
119120
120- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) == nullptr );
121+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) == nullptr );
121122}
122123
123124TEST (DexFileTest, from_memory_open) {
124125 MemoryFake memory;
125126
126127 memory.SetMemory (0x1000 , kDexData , sizeof (kDexData ));
127128
128- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) != nullptr );
129+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) != nullptr );
129130}
130131
131132TEST (DexFileTest, from_memory_no_leak) {
@@ -136,7 +137,7 @@ TEST(DexFileTest, from_memory_no_leak) {
136137 size_t first_allocated_bytes = 0 ;
137138 size_t last_allocated_bytes = 0 ;
138139 for (size_t i = 0 ; i < kNumLeakLoops ; i++) {
139- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) != nullptr );
140+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) != nullptr );
140141 ASSERT_NO_FATAL_FAILURE (CheckForLeak (i, &first_allocated_bytes, &last_allocated_bytes));
141142 }
142143}
@@ -213,6 +214,43 @@ TEST(DexFileTest, create_using_memory_file_is_malformed) {
213214 EXPECT_TRUE (dex_file == nullptr );
214215}
215216
217+ TEST (DexFileTest, create_using_memory_size_too_small) {
218+ MemoryFake memory;
219+ memory.SetMemory (0x4000 , kDexData , sizeof (kDexData ));
220+ MapInfo info (nullptr , nullptr , 0x100 , sizeof (kDexData ) - 2 , 0x200 , 0x5 , " /does/not/exist" );
221+ EXPECT_TRUE (DexFile::Create (0x4000 , &memory, &info) != nullptr );
222+ }
223+
224+ class MemoryLocalFake : public MemoryLocal {
225+ public:
226+ MemoryLocalFake (size_t memory_size) : backing_(memory_size) {}
227+ virtual ~MemoryLocalFake () = default ;
228+
229+ void * Data () { return backing_.data (); }
230+
231+ private:
232+ std::vector<void *> backing_;
233+ };
234+
235+ TEST (DexFileTest, create_using_local_memory) {
236+ MemoryLocalFake memory (sizeof (kDexData ));
237+
238+ memcpy (memory.Data (), kDexData , sizeof (kDexData ));
239+ uint64_t start = reinterpret_cast <uint64_t >(memory.Data ());
240+ MapInfo info (nullptr , nullptr , start, start + 0x1000 , 0x200 , 0x5 , " /does/not/exist" );
241+ EXPECT_TRUE (DexFile::Create (start, &memory, &info) != nullptr );
242+ }
243+
244+ TEST (DexFileTest, create_using_local_memory_size_too_small) {
245+ MemoryLocalFake memory (sizeof (kDexData ));
246+
247+ memcpy (memory.Data (), kDexData , sizeof (kDexData ));
248+ uint64_t start = reinterpret_cast <uint64_t >(memory.Data ());
249+ MapInfo info (nullptr , nullptr , start, start + sizeof (kDexData ) - 2 , 0x200 , 0x5 ,
250+ " /does/not/exist" );
251+ EXPECT_TRUE (DexFile::Create (start, &memory, &info) == nullptr );
252+ }
253+
216254TEST (DexFileTest, get_method) {
217255 MemoryFake memory;
218256 memory.SetMemory (0x4000 , kDexData , sizeof (kDexData ));
0 commit comments