Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63ec4c61 authored by Akilesh Kailash's avatar Akilesh Kailash
Browse files

libsnapshot: Verify the ordering of COW operations.



Sequence op should contain all ordered ops followed
by Replace and Zero ops. There shouldn't be any non-ordered
ops embedded between ordered ops in the sequence ordering.

Bug: 290159346
Test: inspect_cow <cow_file>, OTA
Change-Id: Ia840340b0e4be07525f216838043bf0265f690c3
Signed-off-by: default avatarAkilesh Kailash <akailash@google.com>
parent 4a33c22c
Loading
Loading
Loading
Loading
+25 −0
Original line number Original line Diff line number Diff line
@@ -310,9 +310,34 @@ bool CowReader::PrepMergeOps() {
bool CowReader::VerifyMergeOps() {
bool CowReader::VerifyMergeOps() {
    auto itr = GetMergeOpIter(true);
    auto itr = GetMergeOpIter(true);
    std::unordered_map<uint64_t, const CowOperation*> overwritten_blocks;
    std::unordered_map<uint64_t, const CowOperation*> overwritten_blocks;
    bool non_ordered_op_found = false;

    while (!itr->AtEnd()) {
    while (!itr->AtEnd()) {
        const auto& op = itr->Get();
        const auto& op = itr->Get();
        uint64_t offset;
        uint64_t offset;

        // Op should not be a metadata
        if (IsMetadataOp(*op)) {
            LOG(ERROR) << "Metadata op: " << op << " found during merge sequence";
            return false;
        }

        // Sequence ops should contain all the ordered ops followed
        // by Replace and Zero ops. If we find the first op which
        // is not ordered, that means all ordered ops processing
        // has been completed.
        if (!IsOrderedOp(*op)) {
            non_ordered_op_found = true;
        }

        // Since, all ordered ops processing has been completed,
        // check that the subsequent ops are not ordered.
        if (non_ordered_op_found && IsOrderedOp(*op)) {
            LOG(ERROR) << "Invalid sequence - non-ordered and ordered ops"
                       << " cannot be mixed during sequence generation";
            return false;
        }

        if (!GetSourceOffset(op, &offset)) {
        if (!GetSourceOffset(op, &offset)) {
            itr->Next();
            itr->Next();
            continue;
            continue;