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
This commit is contained in:
@@ -594,7 +594,12 @@ void _FileAsset::close(void)
|
||||
*/
|
||||
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)
|
||||
|
||||
@@ -91,7 +91,8 @@ public:
|
||||
* Get a pointer to a buffer with the entire contents of the file.
|
||||
* If `aligned` is true, the buffer data will be aligned to a 4-byte boundary.
|
||||
*
|
||||
* Use this function if the asset can never reside on IncFs.
|
||||
* If the buffer contents reside on IncFs, the entire buffer will be scanned to ensure the
|
||||
* presence of the data before returning a raw pointer to the buffer.
|
||||
*/
|
||||
virtual const void* getBuffer(bool aligned) = 0;
|
||||
|
||||
@@ -99,7 +100,8 @@ public:
|
||||
* Get a incfs::map_ptr<void> to a buffer with the entire contents of the file.
|
||||
* If `aligned` is true, the buffer data will be aligned to a 4-byte boundary.
|
||||
*
|
||||
* Use this function if the asset can potentially reside on IncFs.
|
||||
* Use this function if the asset can potentially reside on IncFs to avoid the scanning of the
|
||||
* buffer contents done in Asset::getBuffer.
|
||||
*/
|
||||
virtual incfs::map_ptr<void> getIncFsBuffer(bool aligned) = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user