| 796 | } |
| 797 | |
| 798 | static void parse_subpart_dir(struct buffer *subpart_dir_buf, |
| 799 | struct buffer *input_buf, const char *name) |
| 800 | { |
| 801 | struct subpart_dir_header hdr; |
| 802 | size_t offset = 0; |
| 803 | uint8_t *data = buffer_get(input_buf); |
| 804 | size_t size = buffer_size(input_buf); |
| 805 | |
| 806 | /* Read Subpart_Dir header. */ |
| 807 | assert(size >= SUBPART_DIR_HEADER_SIZE); |
| 808 | offset = read_member(data, offset, sizeof(hdr.marker), &hdr.marker); |
| 809 | offset = read_member(data, offset, sizeof(hdr.num_entries), |
| 810 | &hdr.num_entries); |
| 811 | offset = read_member(data, offset, sizeof(hdr.header_version), |
| 812 | &hdr.header_version); |
| 813 | offset = read_member(data, offset, sizeof(hdr.entry_version), |
| 814 | &hdr.entry_version); |
| 815 | offset = read_member(data, offset, sizeof(hdr.header_length), |
| 816 | &hdr.header_length); |
| 817 | offset = read_member(data, offset, sizeof(hdr.checksum), &hdr.checksum); |
| 818 | memcpy(hdr.name, data + offset, sizeof(hdr.name)); |
| 819 | offset += sizeof(hdr.name); |
| 820 | |
| 821 | validate_subpart_dir_without_checksum((struct subpart_dir *)&hdr, name); |
| 822 | |
| 823 | assert(size > subpart_dir_size(&hdr)); |
| 824 | alloc_buffer(subpart_dir_buf, subpart_dir_size(&hdr), "Subpart Dir"); |
| 825 | memcpy(buffer_get(subpart_dir_buf), &hdr, SUBPART_DIR_HEADER_SIZE); |
| 826 | |
| 827 | /* Read Subpart Dir entries. */ |
| 828 | struct subpart_dir *subpart_dir = buffer_get(subpart_dir_buf); |
| 829 | struct subpart_dir_entry *e = &subpart_dir->e[0]; |
| 830 | uint32_t i; |
| 831 | for (i = 0; i < hdr.num_entries; i++) { |
| 832 | memcpy(e[i].name, data + offset, sizeof(e[i].name)); |
| 833 | offset += sizeof(e[i].name); |
| 834 | offset = read_member(data, offset, sizeof(e[i].offset), |
| 835 | &e[i].offset); |
| 836 | offset = read_member(data, offset, sizeof(e[i].length), |
| 837 | &e[i].length); |
| 838 | offset = read_member(data, offset, sizeof(e[i].rsvd), |
| 839 | &e[i].rsvd); |
| 840 | } |
| 841 | |
| 842 | validate_subpart_dir_with_checksum(subpart_dir, name); |
| 843 | |
| 844 | print_subpart_dir(subpart_dir); |
| 845 | } |
| 846 | |
| 847 | /* Parse the bpdt entries to compute the size of the BPDT */ |
| 848 | static size_t bpdt_size(void *data) |
no test coverage detected