AAPT: Fix use-after-free error

Re-order deletion of ResXMLTree and the Asset object
it iterates over.

Bug:30844391
Change-Id: Ied033d0a8f93343006228a2054c6d0f42bb4717a
This commit is contained in:
Adam Lesinski
2016-08-15 14:19:46 -07:00
parent 58635e74ed
commit 193ed74c2d

View File

@ -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;