OSDN Git Service

Memory leak in parsePackage
authorHenrik Baard <henrik.baard@sonymobile.com>
Wed, 18 Jun 2014 11:34:01 +0000 (13:34 +0200)
committerHenrik Baard <henrik.baard@sonymobile.com>
Mon, 23 Jun 2014 12:03:46 +0000 (14:03 +0200)
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

index 1ffe665..2c828c1 100644 (file)
@@ -5405,23 +5405,33 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg,
                 return (mError=err);
             }
 
+            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);
             }
-            group->basePackage = package;
 
             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");