Verify presence of _FileAsset::getBuffer data
Rather than attempt to remove all users of Asset::getBuffer (which
includes AssetManager(1), aapt(1), and other places) and migrate them
to use Asset::getIncFsBuffer, verify the presence of all the data in
the buffer before returning a raw pointer to the buffer data to
guarantee callers will not unexpectedly get a SIGBUS due to incremental
installation.
Bug: 179254882
Test: builds
Change-Id: I24fd9036bc53a8c23166b5471862ee542630fb56
diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp
index 4fbe4a3..43a70c1 100644
--- a/libs/androidfw/Asset.cpp
+++ b/libs/androidfw/Asset.cpp
@@ -594,7 +594,12 @@
*/
const void* _FileAsset::getBuffer(bool aligned)
{
- return getIncFsBuffer(aligned).unsafe_ptr();
+ auto buffer = getIncFsBuffer(aligned);
+ if (mBuf != NULL)
+ return mBuf;
+ if (!buffer.convert<uint8_t>().verify(mLength))
+ return NULL;
+ return buffer.unsafe_ptr();
}
incfs::map_ptr<void> _FileAsset::getIncFsBuffer(bool aligned)