Loading cmds/idmap2/idmap2d/Idmap2Service.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -265,6 +265,7 @@ Status Idmap2Service::createFabricatedOverlay( res.configuration.value_or(std::string())); res.configuration.value_or(std::string())); } else if (res.binaryData.has_value()) { } else if (res.binaryData.has_value()) { builder.SetResourceValue(res.resourceName, res.binaryData->get(), builder.SetResourceValue(res.resourceName, res.binaryData->get(), res.binaryDataOffset, res.binaryDataSize, res.configuration.value_or(std::string())); res.configuration.value_or(std::string())); } else { } else { builder.SetResourceValue(res.resourceName, res.dataType, res.data, builder.SetResourceValue(res.resourceName, res.dataType, res.data, Loading cmds/idmap2/idmap2d/aidl/core/android/os/FabricatedOverlayInternalEntry.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -26,4 +26,6 @@ parcelable FabricatedOverlayInternalEntry { @nullable @utf8InCpp String stringData; @nullable @utf8InCpp String stringData; @nullable ParcelFileDescriptor binaryData; @nullable ParcelFileDescriptor binaryData; @nullable @utf8InCpp String configuration; @nullable @utf8InCpp String configuration; long binaryDataOffset; long binaryDataSize; } } No newline at end of file cmds/idmap2/include/idmap2/FabricatedOverlay.h +12 −2 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,8 @@ struct FabricatedOverlay { Builder& SetResourceValue(const std::string& resource_name, Builder& SetResourceValue(const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, std::optional<android::base::borrowed_fd>&& binary_value, off64_t data_binary_offset, size_t data_binary_size, const std::string& configuration); const std::string& configuration); inline Builder& setFrroPath(std::string frro_path) { inline Builder& setFrroPath(std::string frro_path) { Loading @@ -65,6 +67,8 @@ struct FabricatedOverlay { DataValue data_value; DataValue data_value; std::string data_string_value; std::string data_string_value; std::optional<android::base::borrowed_fd> data_binary_value; std::optional<android::base::borrowed_fd> data_binary_value; off64_t data_binary_offset; size_t data_binary_size; std::string configuration; std::string configuration; }; }; Loading @@ -76,6 +80,12 @@ struct FabricatedOverlay { std::vector<Entry> entries_; std::vector<Entry> entries_; }; }; struct BinaryData { android::base::borrowed_fd file_descriptor; off64_t offset; size_t size; }; Result<Unit> ToBinaryStream(std::ostream& stream) const; Result<Unit> ToBinaryStream(std::ostream& stream) const; static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream); static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream); Loading @@ -92,13 +102,13 @@ struct FabricatedOverlay { explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay, explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay, std::string&& string_pool_data_, std::string&& string_pool_data_, std::vector<android::base::borrowed_fd> binary_files_, std::vector<FabricatedOverlay::BinaryData> binary_files_, off_t total_binary_bytes_, off_t total_binary_bytes_, std::optional<uint32_t> crc_from_disk = {}); std::optional<uint32_t> crc_from_disk = {}); pb::FabricatedOverlay overlay_pb_; pb::FabricatedOverlay overlay_pb_; std::string string_pool_data_; std::string string_pool_data_; std::vector<android::base::borrowed_fd> binary_files_; std::vector<FabricatedOverlay::BinaryData> binary_files_; uint32_t total_binary_bytes_; uint32_t total_binary_bytes_; std::optional<uint32_t> crc_from_disk_; std::optional<uint32_t> crc_from_disk_; mutable std::optional<SerializedData> data_; mutable std::optional<SerializedData> data_; Loading cmds/idmap2/include/idmap2/ResourceUtils.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,8 @@ struct TargetValue { DataValue data_value; DataValue data_value; std::string data_string_value; std::string data_string_value; std::optional<android::base::borrowed_fd> data_binary_value; std::optional<android::base::borrowed_fd> data_binary_value; off64_t data_binary_offset; size_t data_binary_size; }; }; struct TargetValueWithConfig { struct TargetValueWithConfig { Loading cmds/idmap2/libidmap2/FabricatedOverlay.cpp +18 −16 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ void Write32(std::ostream& stream, uint32_t value) { FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay, FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay, std::string&& string_pool_data, std::string&& string_pool_data, std::vector<android::base::borrowed_fd> binary_files, std::vector<FabricatedOverlay::BinaryData> binary_files, off_t total_binary_bytes, off_t total_binary_bytes, std::optional<uint32_t> crc_from_disk) std::optional<uint32_t> crc_from_disk) : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)), : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)), Loading @@ -81,7 +81,7 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, uint8_t data_type, uint32_t data_value, const std::string& resource_name, uint8_t data_type, uint32_t data_value, const std::string& configuration) { const std::string& configuration) { entries_.emplace_back( entries_.emplace_back( Entry{resource_name, data_type, data_value, "", std::nullopt, configuration}); Entry{resource_name, data_type, data_value, "", std::nullopt, 0, 0, configuration}); return *this; return *this; } } Loading @@ -89,14 +89,15 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, uint8_t data_type, const std::string& data_string_value, const std::string& resource_name, uint8_t data_type, const std::string& data_string_value, const std::string& configuration) { const std::string& configuration) { entries_.emplace_back( entries_.emplace_back( Entry{resource_name, data_type, 0, data_string_value, std::nullopt, configuration}); Entry{resource_name, data_type, 0, data_string_value, std::nullopt, 0, 0, configuration}); return *this; return *this; } } FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, const std::string& configuration) { off64_t data_binary_offset, size_t data_binary_size, const std::string& configuration) { entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value, configuration}); entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value, data_binary_offset, data_binary_size, configuration}); return *this; return *this; } } Loading Loading @@ -148,7 +149,8 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { } } value->second = TargetValue{res_entry.data_type, res_entry.data_value, value->second = TargetValue{res_entry.data_type, res_entry.data_value, res_entry.data_string_value, res_entry.data_binary_value}; res_entry.data_string_value, res_entry.data_binary_value, res_entry.data_binary_offset, res_entry.data_binary_size}; } } pb::FabricatedOverlay overlay_pb; pb::FabricatedOverlay overlay_pb; Loading @@ -157,7 +159,7 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { overlay_pb.set_target_package_name(target_package_name_); overlay_pb.set_target_package_name(target_package_name_); overlay_pb.set_target_overlayable(target_overlayable_); overlay_pb.set_target_overlayable(target_overlayable_); std::vector<android::base::borrowed_fd> binary_files; std::vector<FabricatedOverlay::BinaryData> binary_files; size_t total_binary_bytes = 0; size_t total_binary_bytes = 0; // 16 for the number of bytes in the frro file before the binary data // 16 for the number of bytes in the frro file before the binary data const size_t FRRO_HEADER_SIZE = 16; const size_t FRRO_HEADER_SIZE = 16; Loading @@ -182,16 +184,15 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { pb_value->set_data_value(ref.index()); pb_value->set_data_value(ref.index()); } else if (value.second.data_binary_value.has_value()) { } else if (value.second.data_binary_value.has_value()) { pb_value->set_data_type(Res_value::TYPE_STRING); pb_value->set_data_type(Res_value::TYPE_STRING); struct stat s; if (fstat(value.second.data_binary_value->get(), &s) == -1) { return Error("unable to get size of binary file: %d", errno); } std::string uri std::string uri = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(), = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(), static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes), static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes), static_cast<int> (s.st_size)); static_cast<int> (value.second.data_binary_size)); total_binary_bytes += s.st_size; total_binary_bytes += value.second.data_binary_size; binary_files.emplace_back(value.second.data_binary_value->get()); binary_files.emplace_back(FabricatedOverlay::BinaryData{ value.second.data_binary_value->get(), value.second.data_binary_offset, value.second.data_binary_size}); auto ref = string_pool.MakeRef(std::move(uri)); auto ref = string_pool.MakeRef(std::move(uri)); pb_value->set_data_value(ref.index()); pb_value->set_data_value(ref.index()); } else { } else { Loading Loading @@ -310,8 +311,9 @@ Result<Unit> FabricatedOverlay::ToBinaryStream(std::ostream& stream) const { Write32(stream, (*data)->pb_crc); Write32(stream, (*data)->pb_crc); Write32(stream, total_binary_bytes_); Write32(stream, total_binary_bytes_); std::string file_contents; std::string file_contents; for (const android::base::borrowed_fd fd : binary_files_) { for (const FabricatedOverlay::BinaryData fd : binary_files_) { if (!ReadFdToString(fd, &file_contents)) { file_contents.resize(fd.size); if (!ReadFullyAtOffset(fd.file_descriptor, file_contents.data(), fd.size, fd.offset)) { return Error("Failed to read binary file data."); return Error("Failed to read binary file data."); } } stream.write(file_contents.data(), file_contents.length()); stream.write(file_contents.data(), file_contents.length()); Loading Loading
cmds/idmap2/idmap2d/Idmap2Service.cpp +2 −1 Original line number Original line Diff line number Diff line Loading @@ -265,6 +265,7 @@ Status Idmap2Service::createFabricatedOverlay( res.configuration.value_or(std::string())); res.configuration.value_or(std::string())); } else if (res.binaryData.has_value()) { } else if (res.binaryData.has_value()) { builder.SetResourceValue(res.resourceName, res.binaryData->get(), builder.SetResourceValue(res.resourceName, res.binaryData->get(), res.binaryDataOffset, res.binaryDataSize, res.configuration.value_or(std::string())); res.configuration.value_or(std::string())); } else { } else { builder.SetResourceValue(res.resourceName, res.dataType, res.data, builder.SetResourceValue(res.resourceName, res.dataType, res.data, Loading
cmds/idmap2/idmap2d/aidl/core/android/os/FabricatedOverlayInternalEntry.aidl +2 −0 Original line number Original line Diff line number Diff line Loading @@ -26,4 +26,6 @@ parcelable FabricatedOverlayInternalEntry { @nullable @utf8InCpp String stringData; @nullable @utf8InCpp String stringData; @nullable ParcelFileDescriptor binaryData; @nullable ParcelFileDescriptor binaryData; @nullable @utf8InCpp String configuration; @nullable @utf8InCpp String configuration; long binaryDataOffset; long binaryDataSize; } } No newline at end of file
cmds/idmap2/include/idmap2/FabricatedOverlay.h +12 −2 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,8 @@ struct FabricatedOverlay { Builder& SetResourceValue(const std::string& resource_name, Builder& SetResourceValue(const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, std::optional<android::base::borrowed_fd>&& binary_value, off64_t data_binary_offset, size_t data_binary_size, const std::string& configuration); const std::string& configuration); inline Builder& setFrroPath(std::string frro_path) { inline Builder& setFrroPath(std::string frro_path) { Loading @@ -65,6 +67,8 @@ struct FabricatedOverlay { DataValue data_value; DataValue data_value; std::string data_string_value; std::string data_string_value; std::optional<android::base::borrowed_fd> data_binary_value; std::optional<android::base::borrowed_fd> data_binary_value; off64_t data_binary_offset; size_t data_binary_size; std::string configuration; std::string configuration; }; }; Loading @@ -76,6 +80,12 @@ struct FabricatedOverlay { std::vector<Entry> entries_; std::vector<Entry> entries_; }; }; struct BinaryData { android::base::borrowed_fd file_descriptor; off64_t offset; size_t size; }; Result<Unit> ToBinaryStream(std::ostream& stream) const; Result<Unit> ToBinaryStream(std::ostream& stream) const; static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream); static Result<FabricatedOverlay> FromBinaryStream(std::istream& stream); Loading @@ -92,13 +102,13 @@ struct FabricatedOverlay { explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay, explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay, std::string&& string_pool_data_, std::string&& string_pool_data_, std::vector<android::base::borrowed_fd> binary_files_, std::vector<FabricatedOverlay::BinaryData> binary_files_, off_t total_binary_bytes_, off_t total_binary_bytes_, std::optional<uint32_t> crc_from_disk = {}); std::optional<uint32_t> crc_from_disk = {}); pb::FabricatedOverlay overlay_pb_; pb::FabricatedOverlay overlay_pb_; std::string string_pool_data_; std::string string_pool_data_; std::vector<android::base::borrowed_fd> binary_files_; std::vector<FabricatedOverlay::BinaryData> binary_files_; uint32_t total_binary_bytes_; uint32_t total_binary_bytes_; std::optional<uint32_t> crc_from_disk_; std::optional<uint32_t> crc_from_disk_; mutable std::optional<SerializedData> data_; mutable std::optional<SerializedData> data_; Loading
cmds/idmap2/include/idmap2/ResourceUtils.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -43,6 +43,8 @@ struct TargetValue { DataValue data_value; DataValue data_value; std::string data_string_value; std::string data_string_value; std::optional<android::base::borrowed_fd> data_binary_value; std::optional<android::base::borrowed_fd> data_binary_value; off64_t data_binary_offset; size_t data_binary_size; }; }; struct TargetValueWithConfig { struct TargetValueWithConfig { Loading
cmds/idmap2/libidmap2/FabricatedOverlay.cpp +18 −16 Original line number Original line Diff line number Diff line Loading @@ -55,7 +55,7 @@ void Write32(std::ostream& stream, uint32_t value) { FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay, FabricatedOverlay::FabricatedOverlay(pb::FabricatedOverlay&& overlay, std::string&& string_pool_data, std::string&& string_pool_data, std::vector<android::base::borrowed_fd> binary_files, std::vector<FabricatedOverlay::BinaryData> binary_files, off_t total_binary_bytes, off_t total_binary_bytes, std::optional<uint32_t> crc_from_disk) std::optional<uint32_t> crc_from_disk) : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)), : overlay_pb_(std::forward<pb::FabricatedOverlay>(overlay)), Loading @@ -81,7 +81,7 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, uint8_t data_type, uint32_t data_value, const std::string& resource_name, uint8_t data_type, uint32_t data_value, const std::string& configuration) { const std::string& configuration) { entries_.emplace_back( entries_.emplace_back( Entry{resource_name, data_type, data_value, "", std::nullopt, configuration}); Entry{resource_name, data_type, data_value, "", std::nullopt, 0, 0, configuration}); return *this; return *this; } } Loading @@ -89,14 +89,15 @@ FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, uint8_t data_type, const std::string& data_string_value, const std::string& resource_name, uint8_t data_type, const std::string& data_string_value, const std::string& configuration) { const std::string& configuration) { entries_.emplace_back( entries_.emplace_back( Entry{resource_name, data_type, 0, data_string_value, std::nullopt, configuration}); Entry{resource_name, data_type, 0, data_string_value, std::nullopt, 0, 0, configuration}); return *this; return *this; } } FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( FabricatedOverlay::Builder& FabricatedOverlay::Builder::SetResourceValue( const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, const std::string& resource_name, std::optional<android::base::borrowed_fd>&& binary_value, const std::string& configuration) { off64_t data_binary_offset, size_t data_binary_size, const std::string& configuration) { entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value, configuration}); entries_.emplace_back(Entry{resource_name, 0, 0, "", binary_value, data_binary_offset, data_binary_size, configuration}); return *this; return *this; } } Loading Loading @@ -148,7 +149,8 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { } } value->second = TargetValue{res_entry.data_type, res_entry.data_value, value->second = TargetValue{res_entry.data_type, res_entry.data_value, res_entry.data_string_value, res_entry.data_binary_value}; res_entry.data_string_value, res_entry.data_binary_value, res_entry.data_binary_offset, res_entry.data_binary_size}; } } pb::FabricatedOverlay overlay_pb; pb::FabricatedOverlay overlay_pb; Loading @@ -157,7 +159,7 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { overlay_pb.set_target_package_name(target_package_name_); overlay_pb.set_target_package_name(target_package_name_); overlay_pb.set_target_overlayable(target_overlayable_); overlay_pb.set_target_overlayable(target_overlayable_); std::vector<android::base::borrowed_fd> binary_files; std::vector<FabricatedOverlay::BinaryData> binary_files; size_t total_binary_bytes = 0; size_t total_binary_bytes = 0; // 16 for the number of bytes in the frro file before the binary data // 16 for the number of bytes in the frro file before the binary data const size_t FRRO_HEADER_SIZE = 16; const size_t FRRO_HEADER_SIZE = 16; Loading @@ -182,16 +184,15 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() { pb_value->set_data_value(ref.index()); pb_value->set_data_value(ref.index()); } else if (value.second.data_binary_value.has_value()) { } else if (value.second.data_binary_value.has_value()) { pb_value->set_data_type(Res_value::TYPE_STRING); pb_value->set_data_type(Res_value::TYPE_STRING); struct stat s; if (fstat(value.second.data_binary_value->get(), &s) == -1) { return Error("unable to get size of binary file: %d", errno); } std::string uri std::string uri = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(), = StringPrintf("frro:/%s?offset=%d&size=%d", frro_path_.c_str(), static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes), static_cast<int> (FRRO_HEADER_SIZE + total_binary_bytes), static_cast<int> (s.st_size)); static_cast<int> (value.second.data_binary_size)); total_binary_bytes += s.st_size; total_binary_bytes += value.second.data_binary_size; binary_files.emplace_back(value.second.data_binary_value->get()); binary_files.emplace_back(FabricatedOverlay::BinaryData{ value.second.data_binary_value->get(), value.second.data_binary_offset, value.second.data_binary_size}); auto ref = string_pool.MakeRef(std::move(uri)); auto ref = string_pool.MakeRef(std::move(uri)); pb_value->set_data_value(ref.index()); pb_value->set_data_value(ref.index()); } else { } else { Loading Loading @@ -310,8 +311,9 @@ Result<Unit> FabricatedOverlay::ToBinaryStream(std::ostream& stream) const { Write32(stream, (*data)->pb_crc); Write32(stream, (*data)->pb_crc); Write32(stream, total_binary_bytes_); Write32(stream, total_binary_bytes_); std::string file_contents; std::string file_contents; for (const android::base::borrowed_fd fd : binary_files_) { for (const FabricatedOverlay::BinaryData fd : binary_files_) { if (!ReadFdToString(fd, &file_contents)) { file_contents.resize(fd.size); if (!ReadFullyAtOffset(fd.file_descriptor, file_contents.data(), fd.size, fd.offset)) { return Error("Failed to read binary file data."); return Error("Failed to read binary file data."); } } stream.write(file_contents.data(), file_contents.length()); stream.write(file_contents.data(), file_contents.length()); Loading