| 41 | } |
| 42 | |
| 43 | static int parse_footer(struct reftable_table *t, uint8_t *footer, |
| 44 | uint8_t *header) |
| 45 | { |
| 46 | uint8_t *f = footer; |
| 47 | uint8_t first_block_typ; |
| 48 | int err = 0; |
| 49 | uint32_t computed_crc; |
| 50 | uint32_t file_crc; |
| 51 | |
| 52 | if (memcmp(f, "REFT", 4)) { |
| 53 | err = REFTABLE_FORMAT_ERROR; |
| 54 | goto done; |
| 55 | } |
| 56 | f += 4; |
| 57 | |
| 58 | if (memcmp(footer, header, header_size(t->version))) { |
| 59 | err = REFTABLE_FORMAT_ERROR; |
| 60 | goto done; |
| 61 | } |
| 62 | |
| 63 | f++; |
| 64 | t->block_size = reftable_get_be24(f); |
| 65 | |
| 66 | f += 3; |
| 67 | t->min_update_index = reftable_get_be64(f); |
| 68 | f += 8; |
| 69 | t->max_update_index = reftable_get_be64(f); |
| 70 | f += 8; |
| 71 | |
| 72 | if (t->version == 1) { |
| 73 | t->hash_id = REFTABLE_HASH_SHA1; |
| 74 | } else { |
| 75 | switch (reftable_get_be32(f)) { |
| 76 | case REFTABLE_FORMAT_ID_SHA1: |
| 77 | t->hash_id = REFTABLE_HASH_SHA1; |
| 78 | break; |
| 79 | case REFTABLE_FORMAT_ID_SHA256: |
| 80 | t->hash_id = REFTABLE_HASH_SHA256; |
| 81 | break; |
| 82 | default: |
| 83 | err = REFTABLE_FORMAT_ERROR; |
| 84 | goto done; |
| 85 | } |
| 86 | |
| 87 | f += 4; |
| 88 | } |
| 89 | |
| 90 | t->ref_offsets.index_offset = reftable_get_be64(f); |
| 91 | f += 8; |
| 92 | |
| 93 | t->obj_offsets.offset = reftable_get_be64(f); |
| 94 | f += 8; |
| 95 | |
| 96 | t->object_id_len = t->obj_offsets.offset & ((1 << 5) - 1); |
| 97 | t->obj_offsets.offset >>= 5; |
| 98 | |
| 99 | t->obj_offsets.index_offset = reftable_get_be64(f); |
| 100 | f += 8; |
no test coverage detected