Loading fs_mgr/liblp/builder.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -269,6 +269,11 @@ void MetadataBuilder::ImportExtents(Partition* dest, const LpMetadata& metadata, } static bool VerifyDeviceProperties(const BlockDeviceInfo& device_info) { if (device_info.logical_block_size == 0) { LERROR << "Block device " << device_info.partition_name << " logical block size must not be zero."; return false; } if (device_info.logical_block_size % LP_SECTOR_SIZE != 0) { LERROR << "Block device " << device_info.partition_name << " logical block size must be a multiple of 512."; Loading Loading @@ -335,7 +340,7 @@ bool MetadataBuilder::Init(const std::vector<BlockDeviceInfo>& block_devices, out.alignment = device_info.alignment; out.alignment_offset = device_info.alignment_offset; out.size = device_info.size; if (device_info.partition_name.size() >= sizeof(out.partition_name)) { if (device_info.partition_name.size() > sizeof(out.partition_name)) { LERROR << "Partition name " << device_info.partition_name << " exceeds maximum length."; return false; } Loading fs_mgr/liblp/include/liblp/metadata_format.h +3 −3 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ typedef struct LpMetadataGeometry { * num_entries, and the result must not overflow a 32-bit signed integer. */ typedef struct LpMetadataTableDescriptor { /* 0: Location of the table, relative to the metadata header. */ /* 0: Location of the table, relative to end of the metadata header. */ uint32_t offset; /* 4: Number of entries in the table. */ uint32_t num_entries; Loading Loading @@ -272,7 +272,7 @@ typedef struct LpMetadataPartitionGroup { /* 40: Maximum size in bytes. If 0, the group has no maximum size. */ uint64_t maximum_size; } LpMetadataPartitionGroup; } __attribute__((packed)) LpMetadataPartitionGroup; /* This flag is only intended to be used with super_empty.img and super.img on * retrofit devices. If set, the group needs a slot suffix to be interpreted Loading Loading @@ -323,7 +323,7 @@ typedef struct LpMetadataBlockDevice { /* 60: Flags (see LP_BLOCK_DEVICE_* flags below). */ uint32_t flags; } LpMetadataBlockDevice; } __attribute__((packed)) LpMetadataBlockDevice; /* This flag is only intended to be used with super_empty.img and super.img on * retrofit devices. On these devices there are A and B super partitions, and Loading fs_mgr/liblp/reader.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,10 @@ static std::unique_ptr<LpMetadata> ParseMetadata(const LpMetadataGeometry& geome LERROR << "Logical partition has invalid attribute set."; return nullptr; } if (partition.first_extent_index + partition.num_extents < partition.first_extent_index) { LERROR << "Logical partition first_extent_index + num_extents overflowed."; return nullptr; } if (partition.first_extent_index + partition.num_extents > header.extents.num_entries) { LERROR << "Logical partition has invalid extent list."; return nullptr; Loading fs_mgr/liblp/writer.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -373,11 +373,11 @@ bool UpdatePartitionTable(const IPartitionOpener& opener, const std::string& sup // safety. std::string old_blob; if (!ValidateAndSerializeMetadata(opener, *backup.get(), slot_suffix, &old_blob)) { LERROR << "Error serializing primary metadata to repair corrupted backup"; LERROR << "Error serializing backup metadata to repair corrupted primary"; return false; } if (!WritePrimaryMetadata(fd, metadata, slot_number, old_blob, writer)) { LERROR << "Error writing primary metadata to repair corrupted backup"; LERROR << "Error writing backup metadata to repair corrupted primary"; return false; } } Loading Loading
fs_mgr/liblp/builder.cpp +6 −1 Original line number Diff line number Diff line Loading @@ -269,6 +269,11 @@ void MetadataBuilder::ImportExtents(Partition* dest, const LpMetadata& metadata, } static bool VerifyDeviceProperties(const BlockDeviceInfo& device_info) { if (device_info.logical_block_size == 0) { LERROR << "Block device " << device_info.partition_name << " logical block size must not be zero."; return false; } if (device_info.logical_block_size % LP_SECTOR_SIZE != 0) { LERROR << "Block device " << device_info.partition_name << " logical block size must be a multiple of 512."; Loading Loading @@ -335,7 +340,7 @@ bool MetadataBuilder::Init(const std::vector<BlockDeviceInfo>& block_devices, out.alignment = device_info.alignment; out.alignment_offset = device_info.alignment_offset; out.size = device_info.size; if (device_info.partition_name.size() >= sizeof(out.partition_name)) { if (device_info.partition_name.size() > sizeof(out.partition_name)) { LERROR << "Partition name " << device_info.partition_name << " exceeds maximum length."; return false; } Loading
fs_mgr/liblp/include/liblp/metadata_format.h +3 −3 Original line number Diff line number Diff line Loading @@ -127,7 +127,7 @@ typedef struct LpMetadataGeometry { * num_entries, and the result must not overflow a 32-bit signed integer. */ typedef struct LpMetadataTableDescriptor { /* 0: Location of the table, relative to the metadata header. */ /* 0: Location of the table, relative to end of the metadata header. */ uint32_t offset; /* 4: Number of entries in the table. */ uint32_t num_entries; Loading Loading @@ -272,7 +272,7 @@ typedef struct LpMetadataPartitionGroup { /* 40: Maximum size in bytes. If 0, the group has no maximum size. */ uint64_t maximum_size; } LpMetadataPartitionGroup; } __attribute__((packed)) LpMetadataPartitionGroup; /* This flag is only intended to be used with super_empty.img and super.img on * retrofit devices. If set, the group needs a slot suffix to be interpreted Loading Loading @@ -323,7 +323,7 @@ typedef struct LpMetadataBlockDevice { /* 60: Flags (see LP_BLOCK_DEVICE_* flags below). */ uint32_t flags; } LpMetadataBlockDevice; } __attribute__((packed)) LpMetadataBlockDevice; /* This flag is only intended to be used with super_empty.img and super.img on * retrofit devices. On these devices there are A and B super partitions, and Loading
fs_mgr/liblp/reader.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -256,6 +256,10 @@ static std::unique_ptr<LpMetadata> ParseMetadata(const LpMetadataGeometry& geome LERROR << "Logical partition has invalid attribute set."; return nullptr; } if (partition.first_extent_index + partition.num_extents < partition.first_extent_index) { LERROR << "Logical partition first_extent_index + num_extents overflowed."; return nullptr; } if (partition.first_extent_index + partition.num_extents > header.extents.num_entries) { LERROR << "Logical partition has invalid extent list."; return nullptr; Loading
fs_mgr/liblp/writer.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -373,11 +373,11 @@ bool UpdatePartitionTable(const IPartitionOpener& opener, const std::string& sup // safety. std::string old_blob; if (!ValidateAndSerializeMetadata(opener, *backup.get(), slot_suffix, &old_blob)) { LERROR << "Error serializing primary metadata to repair corrupted backup"; LERROR << "Error serializing backup metadata to repair corrupted primary"; return false; } if (!WritePrimaryMetadata(fd, metadata, slot_number, old_blob, writer)) { LERROR << "Error writing primary metadata to repair corrupted backup"; LERROR << "Error writing backup metadata to repair corrupted primary"; return false; } } Loading