From 5f7ce10c937abf7da6d547ae91bda495dfbc414d Mon Sep 17 00:00:00 2001 From: Henrik Baard Date: Wed, 18 Jun 2014 13:34:01 +0200 Subject: [PATCH] Memory leak in parsePackage The method parsePackage failes to delete some resources in case of failures. Added delete of "package" in the cases that was previously missed. Change-Id: I183e9ec5864c5ed18bb48410ab41317cb3d96bda --- libs/androidfw/ResourceTypes.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 1ffe6652418c2..2c828c1ee0404 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -5405,23 +5405,33 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, return (mError=err); } - //printf("Adding new package id %d at index %d\n", id, idx); - err = mPackageGroups.add(group); + err = group->packages.add(package); if (err < NO_ERROR) { + delete group; + delete package; return (mError=err); } group->basePackage = package; + //printf("Adding new package id %d at index %d\n", id, idx); + err = mPackageGroups.add(group); + if (err < NO_ERROR) { + delete group; + return (mError=err); + } + mPackageMap[id] = (uint8_t)idx; } else { group = mPackageGroups.itemAt(idx-1); if (group == NULL) { + delete package; return (mError=UNKNOWN_ERROR); } - } - err = group->packages.add(package); - if (err < NO_ERROR) { - return (mError=err); + err = group->packages.add(package); + if (err < NO_ERROR) { + delete package; + return (mError=err); + } } } else { LOG_ALWAYS_FATAL("Package id out of range");