From 09b119fb7d0494e9afd2bf2ec774532fcafe754e Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Tue, 25 Jul 2017 15:00:04 -0700 Subject: [PATCH] AssetManager2: Fix a memory leak Caught by the static analyzer: frameworks/base/libs/androidfw/AssetManager2.cpp:580:9: warning: Potential leak of memory pointed to by 'new_bag' [clang-analyzer-unix.Malloc] Bug: 27101951 Test: mma. Memory leak warning is gone. Change-Id: I532585d4dd376cec1abf4358f26d23f5ae3231cf --- libs/androidfw/AssetManager2.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp index 5667f9283241d..ab7e14de48fb5 100644 --- a/libs/androidfw/AssetManager2.cpp +++ b/libs/androidfw/AssetManager2.cpp @@ -533,8 +533,8 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid) { // Create the max possible entries we can make. Once we construct the bag, // we will realloc to fit to size. const size_t max_count = parent_bag->entry_count + dtohl(map->count); - ResolvedBag* new_bag = reinterpret_cast( - malloc(sizeof(ResolvedBag) + (max_count * sizeof(ResolvedBag::Entry)))); + util::unique_cptr new_bag{reinterpret_cast( + malloc(sizeof(ResolvedBag) + (max_count * sizeof(ResolvedBag::Entry))))}; ResolvedBag::Entry* new_entry = new_bag->entries; const ResolvedBag::Entry* parent_entry = parent_bag->entries; @@ -601,15 +601,14 @@ const ResolvedBag* AssetManager2::GetBag(uint32_t resid) { // Resize the resulting array to fit. const size_t actual_count = new_entry - new_bag->entries; if (actual_count != max_count) { - new_bag = reinterpret_cast( - realloc(new_bag, sizeof(ResolvedBag) + (actual_count * sizeof(ResolvedBag::Entry)))); + new_bag.reset(reinterpret_cast(realloc( + new_bag.release(), sizeof(ResolvedBag) + (actual_count * sizeof(ResolvedBag::Entry))))); } - util::unique_cptr final_bag{new_bag}; - final_bag->type_spec_flags = flags; - final_bag->entry_count = static_cast(actual_count); - ResolvedBag* result = final_bag.get(); - cached_bags_[resid] = std::move(final_bag); + new_bag->type_spec_flags = flags; + new_bag->entry_count = static_cast(actual_count); + ResolvedBag* result = new_bag.get(); + cached_bags_[resid] = std::move(new_bag); return result; }