Hold dex caches live in class table
Prevents temporary dex caches being unloaded for the same dex file.
Usually this is OK, but if someone resolved a string in that dex
cache, it could leave stale pointers in BSS. Also it can use extra
memory in linear alloc if we allocate dex cache arrays multiple
times.
Bug: 29083330
Change-Id: Ia44668f013ceef1f5eb80f653a48d0f8004548c9
diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc
index cce83f3..c4754ce 100644
--- a/dex2oat/dex2oat.cc
+++ b/dex2oat/dex2oat.cc
@@ -1462,7 +1462,8 @@
for (const auto& dex_file : dex_files_) {
ScopedObjectAccess soa(self);
dex_caches_.push_back(soa.AddLocalReference<jobject>(
- class_linker->RegisterDexFile(*dex_file, Runtime::Current()->GetLinearAlloc())));
+ class_linker->RegisterDexFile(*dex_file,
+ soa.Decode<mirror::ClassLoader*>(class_loader_))));
}
return true;