OSDN Git Service

Fix app image memory leak
authorMathieu Chartier <mathieuc@google.com>
Fri, 12 Feb 2016 00:27:18 +0000 (16:27 -0800)
committerMathieu Chartier <mathieuc@google.com>
Fri, 12 Feb 2016 18:24:00 +0000 (10:24 -0800)
There was a memory leak if we failed to add an image space, this
was caused by releasing ownership without adding it to the heap.

Bug: 22858531

(cherry picked from commit bd064ea2269b23360e32e8139c22d5993ddc385b)

Change-Id: Ib45c0140b82cee5da04ed4a9f101f7c554cb25da

runtime/oat_file_manager.cc

index e76e443..18cf81a 100644 (file)
@@ -387,12 +387,16 @@ std::vector<std::unique_ptr<const DexFile>> OatFileManager::OpenDexFilesFromOat(
             runtime->GetHeap()->AddSpace(image_space.get());
           }
           added_image_space = true;
-          if (!runtime->GetClassLinker()->AddImageSpace(image_space.get(),
-                                                        h_loader,
-                                                        dex_elements,
-                                                        dex_location,
-                                                        /*out*/&dex_files,
-                                                        /*out*/&temp_error_msg)) {
+          if (runtime->GetClassLinker()->AddImageSpace(image_space.get(),
+                                                       h_loader,
+                                                       dex_elements,
+                                                       dex_location,
+                                                       /*out*/&dex_files,
+                                                       /*out*/&temp_error_msg)) {
+            // Successfully added image space to heap, release the map so that it does not get
+            // freed.
+            image_space.release();
+          } else {
             LOG(INFO) << "Failed to add image file " << temp_error_msg;
             dex_files.clear();
             {
@@ -406,7 +410,6 @@ std::vector<std::unique_ptr<const DexFile>> OatFileManager::OpenDexFilesFromOat(
             added_image_space = false;
             // Non-fatal, don't update error_msg.
           }
-          image_space.release();
         }
       }
     }