status_t BackupDataReader::SkipEntityData() { if (m_status != NO_ERROR) { return m_status; } if (m_header.type != BACKUP_HEADER_ENTITY_V1) { return EINVAL; } if (m_header.entity.dataSize > 0) { int pos = lseek(m_fd, m_dataEndPos, SEEK_SET); if (pos == -1) { return errno; } } SKIP_PADDING(); return NO_ERROR; }
status_t BackupDataReader::ReadNextHeader(bool* done, int* type) { *done = m_done; if (m_status != NO_ERROR) { return m_status; } int amt; amt = skip_padding(); if (amt == EIO) { *done = m_done = true; return NO_ERROR; } else if (amt != NO_ERROR) { return amt; } amt = read(m_fd, &m_header, sizeof(m_header)); *done = m_done = (amt == 0); if (*done) { return NO_ERROR; } CHECK_SIZE(amt, sizeof(m_header)); m_pos += sizeof(m_header); if (type) { *type = m_header.type; } // validate and fix up the fields. m_header.type = fromlel(m_header.type); switch (m_header.type) { case BACKUP_HEADER_ENTITY_V1: { m_header.entity.keyLen = fromlel(m_header.entity.keyLen); if (m_header.entity.keyLen <= 0) { ALOGD("Entity header at %d has keyLen<=0: 0x%08x\n", (int)m_pos, (int)m_header.entity.keyLen); m_status = EINVAL; } m_header.entity.dataSize = fromlel(m_header.entity.dataSize); m_entityCount++; // read the rest of the header (filename) size_t size = m_header.entity.keyLen; char* buf = m_key.lockBuffer(size); if (buf == NULL) { m_status = ENOMEM; return m_status; } int amt = read(m_fd, buf, size+1); CHECK_SIZE(amt, (int)size+1); m_key.unlockBuffer(size); m_pos += size+1; SKIP_PADDING(); m_dataEndPos = m_pos + m_header.entity.dataSize; break; } default: ALOGD("Chunk header at %d has invalid type: 0x%08x", (int)(m_pos - sizeof(m_header)), (int)m_header.type); m_status = EINVAL; } return m_status; }