21
21
22
22
#include < unordered_map>
23
23
24
+ #include < MemoryLocal.h>
24
25
#include < android-base/file.h>
25
26
#include < gtest/gtest.h>
26
27
#include < unwindstack/MapInfo.h>
@@ -109,23 +110,23 @@ TEST(DexFileTest, from_memory_fail_too_small_for_header) {
109
110
110
111
memory.SetMemory (0x1000 , kDexData , 10 );
111
112
112
- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) == nullptr );
113
+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) == nullptr );
113
114
}
114
115
115
116
TEST (DexFileTest, from_memory_fail_too_small_for_data) {
116
117
MemoryFake memory;
117
118
118
119
memory.SetMemory (0x1000 , kDexData , sizeof (kDexData ) - 2 );
119
120
120
- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) == nullptr );
121
+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) == nullptr );
121
122
}
122
123
123
124
TEST (DexFileTest, from_memory_open) {
124
125
MemoryFake memory;
125
126
126
127
memory.SetMemory (0x1000 , kDexData , sizeof (kDexData ));
127
128
128
- EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " ) != nullptr );
129
+ EXPECT_TRUE (DexFileFromMemory::Create (0x1000 , &memory, " " , sizeof ( kDexData ) ) != nullptr );
129
130
}
130
131
131
132
TEST (DexFileTest, from_memory_no_leak) {
@@ -136,7 +137,7 @@ TEST(DexFileTest, from_memory_no_leak) {
136
137
size_t first_allocated_bytes = 0 ;
137
138
size_t last_allocated_bytes = 0 ;
138
139
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 );
140
141
ASSERT_NO_FATAL_FAILURE (CheckForLeak (i, &first_allocated_bytes, &last_allocated_bytes));
141
142
}
142
143
}
@@ -213,6 +214,43 @@ TEST(DexFileTest, create_using_memory_file_is_malformed) {
213
214
EXPECT_TRUE (dex_file == nullptr );
214
215
}
215
216
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
+
216
254
TEST (DexFileTest, get_method) {
217
255
MemoryFake memory;
218
256
memory.SetMemory (0x4000 , kDexData , sizeof (kDexData ));
0 commit comments