RecordInfo validateRecord(ByteRange range, uint32_t fileId) { if (range.size() <= headerSize()) { // records may not be empty return {0, {}}; } const Header* header = reinterpret_cast<const Header*>(range.begin()); range.advance(sizeof(Header)); if (header->magic != Header::kMagic || header->version != 0 || header->hashFunction != 0 || header->flags != 0 || (fileId != 0 && header->fileId != fileId) || header->dataLength > range.size()) { return {0, {}}; } if (headerHash(*header) != header->headerHash) { return {0, {}}; } range.reset(range.begin(), header->dataLength); if (dataHash(range) != header->dataHash) { return {0, {}}; } return {header->fileId, range}; }