diff options
author | David Anderson <dvander@google.com> | 2019-11-09 16:04:52 +0100 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-11-09 16:04:52 +0100 |
commit | 405f4d3552803077fab8e5b184f1da475efef90c (patch) | |
tree | 3ffdee4d6d56e0b6c5681413927e34a42f6d7e21 /bootloader_message/bootloader_message.cpp | |
parent | Merge "Stop setting usb config from recovery init script" (diff) | |
parent | bootloader_message: Add helpers for handling IBootControl MergeStatus. (diff) | |
download | android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar.gz android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar.bz2 android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar.lz android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar.xz android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.tar.zst android_bootable_recovery-405f4d3552803077fab8e5b184f1da475efef90c.zip |
Diffstat (limited to 'bootloader_message/bootloader_message.cpp')
-rw-r--r-- | bootloader_message/bootloader_message.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/bootloader_message/bootloader_message.cpp b/bootloader_message/bootloader_message.cpp index f838930fd..4f7085db9 100644 --- a/bootloader_message/bootloader_message.cpp +++ b/bootloader_message/bootloader_message.cpp @@ -292,6 +292,49 @@ bool WriteMiscPartitionVendorSpace(const void* data, size_t size, size_t offset, err); } +static bool ValidateSystemSpaceRegion(size_t offset, size_t size, std::string* err) { + if (size <= SYSTEM_SPACE_SIZE_IN_MISC && offset <= (SYSTEM_SPACE_SIZE_IN_MISC - size)) { + return true; + } + *err = android::base::StringPrintf("Out of bound access (offset %zu size %zu)", offset, size); + return false; +} + +static bool ReadMiscPartitionSystemSpace(void* data, size_t size, size_t offset, std::string* err) { + if (!ValidateSystemSpaceRegion(offset, size, err)) { + return false; + } + auto misc_blk_device = get_misc_blk_device(err); + if (misc_blk_device.empty()) { + return false; + } + return read_misc_partition(data, size, misc_blk_device, SYSTEM_SPACE_OFFSET_IN_MISC + offset, + err); +} + +static bool WriteMiscPartitionSystemSpace(const void* data, size_t size, size_t offset, + std::string* err) { + if (!ValidateSystemSpaceRegion(offset, size, err)) { + return false; + } + auto misc_blk_device = get_misc_blk_device(err); + if (misc_blk_device.empty()) { + return false; + } + return write_misc_partition(data, size, misc_blk_device, SYSTEM_SPACE_OFFSET_IN_MISC + offset, + err); +} + +bool ReadMiscVirtualAbMessage(misc_virtual_ab_message* message, std::string* err) { + return ReadMiscPartitionSystemSpace(message, sizeof(*message), + offsetof(misc_system_space_layout, virtual_ab_message), err); +} + +bool WriteMiscVirtualAbMessage(const misc_virtual_ab_message& message, std::string* err) { + return WriteMiscPartitionSystemSpace(&message, sizeof(message), + offsetof(misc_system_space_layout, virtual_ab_message), err); +} + extern "C" bool write_reboot_bootloader(void) { std::string err; return write_reboot_bootloader(&err); |