diff options
author | Adam Lesinski <adamlesinski@google.com> | 2016-08-15 23:33:01 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-08-15 23:33:01 +0000 |
commit | 00e7ebbe1ae4ff23d7e3469435cb7f9aabcd7a04 (patch) | |
tree | 9964f3b70fcc3606d1acef68ac66e9ce64a0ccad /tools/aapt/Resource.cpp | |
parent | da872974970bdad5b9828407c73c6b1d38d784e2 (diff) | |
parent | 9e8da4a476d1a52d4c287747b5e1b80f61681c15 (diff) |
AAPT: Fix use-after-free error am: 193ed74c2d am: 646f2d9c33
am: 9e8da4a476
Change-Id: I591fd51bf456cd42fe8c633de8924a9f2c844866
Diffstat (limited to 'tools/aapt/Resource.cpp')
-rw-r--r-- | tools/aapt/Resource.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index b4c4d05a7397..1e7875d435eb 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -1033,7 +1033,6 @@ static ssize_t extractPlatformBuildVersion(AssetManager& assets, Bundle* bundle) return NO_ERROR; } - ResXMLTree tree; Asset* asset = assets.openNonAsset(cookie, "AndroidManifest.xml", Asset::ACCESS_STREAMING); if (asset == NULL) { fprintf(stderr, "ERROR: Platform AndroidManifest.xml not found\n"); @@ -1041,11 +1040,17 @@ static ssize_t extractPlatformBuildVersion(AssetManager& assets, Bundle* bundle) } ssize_t result = NO_ERROR; - if (tree.setTo(asset->getBuffer(true), asset->getLength()) != NO_ERROR) { - fprintf(stderr, "ERROR: Platform AndroidManifest.xml is corrupt\n"); - result = UNKNOWN_ERROR; - } else { - result = extractPlatformBuildVersion(tree, bundle); + + // Create a new scope so that ResXMLTree is destroyed before we delete the memory over + // which it iterates (asset). + { + ResXMLTree tree; + if (tree.setTo(asset->getBuffer(true), asset->getLength()) != NO_ERROR) { + fprintf(stderr, "ERROR: Platform AndroidManifest.xml is corrupt\n"); + result = UNKNOWN_ERROR; + } else { + result = extractPlatformBuildVersion(tree, bundle); + } } delete asset; |