Loading libs/androidfw/ZipUtils.cpp +25 −9 Original line number Diff line number Diff line Loading @@ -87,16 +87,26 @@ class BufferReader final : public zip_archive::Reader { } bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override { if (mInputSize < len || offset > mInputSize - len) { auto in = AccessAtOffset(buf, len, offset); if (!in) { return false; } memcpy(buf, in, len); return true; } const uint8_t* AccessAtOffset(uint8_t*, size_t len, off64_t offset) const override { if (offset > mInputSize - len) { return nullptr; } const incfs::map_ptr<uint8_t> pos = mInput.offset(offset); if (!pos.verify(len)) { return false; return nullptr; } return pos.unsafe_ptr(); } memcpy(buf, pos.unsafe_ptr(), len); bool IsZeroCopy() const override { return true; } Loading @@ -107,7 +117,7 @@ class BufferReader final : public zip_archive::Reader { class BufferWriter final : public zip_archive::Writer { public: BufferWriter(void* output, size_t outputSize) : Writer(), BufferWriter(void* output, size_t outputSize) : mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) { } Loading @@ -121,6 +131,12 @@ class BufferWriter final : public zip_archive::Writer { return true; } Buffer GetBuffer(size_t length) override { const auto remaining_size = mOutputSize - mBytesWritten; return remaining_size >= length ? Buffer(mOutput + mBytesWritten, remaining_size) : Buffer(); } private: uint8_t* const mOutput; const size_t mOutputSize; Loading Loading
libs/androidfw/ZipUtils.cpp +25 −9 Original line number Diff line number Diff line Loading @@ -87,16 +87,26 @@ class BufferReader final : public zip_archive::Reader { } bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override { if (mInputSize < len || offset > mInputSize - len) { auto in = AccessAtOffset(buf, len, offset); if (!in) { return false; } memcpy(buf, in, len); return true; } const uint8_t* AccessAtOffset(uint8_t*, size_t len, off64_t offset) const override { if (offset > mInputSize - len) { return nullptr; } const incfs::map_ptr<uint8_t> pos = mInput.offset(offset); if (!pos.verify(len)) { return false; return nullptr; } return pos.unsafe_ptr(); } memcpy(buf, pos.unsafe_ptr(), len); bool IsZeroCopy() const override { return true; } Loading @@ -107,7 +117,7 @@ class BufferReader final : public zip_archive::Reader { class BufferWriter final : public zip_archive::Writer { public: BufferWriter(void* output, size_t outputSize) : Writer(), BufferWriter(void* output, size_t outputSize) : mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) { } Loading @@ -121,6 +131,12 @@ class BufferWriter final : public zip_archive::Writer { return true; } Buffer GetBuffer(size_t length) override { const auto remaining_size = mOutputSize - mBytesWritten; return remaining_size >= length ? Buffer(mOutput + mBytesWritten, remaining_size) : Buffer(); } private: uint8_t* const mOutput; const size_t mOutputSize; Loading