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

Commit 76b1e83f authored by Daniel Zheng's avatar Daniel Zheng
Browse files

Move ReadCowHeader to CowReader

Moving this function to cow reader first we have to read the version of
cow from the header before deciding which parser to use. This is a more
logical place for this code to be in

Test: th
Change-Id: Ie5ba53439b4fc3c4c409426b818a2d53c0cbc3e5
parent e90a39ae
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -188,5 +188,7 @@ class CowReader final : public ICowReader {
    uint8_t compression_type_ = kCowCompressNone;
};

bool ReadCowHeader(android::base::borrowed_fd fd, CowHeader* header);

}  // namespace snapshot
}  // namespace android
+29 −0
Original line number Diff line number Diff line
@@ -34,6 +34,35 @@
namespace android {
namespace snapshot {

bool ReadCowHeader(android::base::borrowed_fd fd, CowHeader* header) {
    if (lseek(fd.get(), 0, SEEK_SET) < 0) {
        PLOG(ERROR) << "lseek header failed";
        return false;
    }

    memset(header, 0, sizeof(*header));

    if (!android::base::ReadFully(fd, &header->prefix, sizeof(header->prefix))) {
        return false;
    }
    if (header->prefix.magic != kCowMagicNumber) {
        LOG(ERROR) << "Header Magic corrupted. Magic: " << header->prefix.magic
                   << "Expected: " << kCowMagicNumber;
        return false;
    }
    if (header->prefix.header_size > sizeof(CowHeader)) {
        LOG(ERROR) << "Unknown CowHeader size (got " << header->prefix.header_size
                   << " bytes, expected at most " << sizeof(CowHeader) << " bytes)";
        return false;
    }

    if (lseek(fd.get(), 0, SEEK_SET) < 0) {
        PLOG(ERROR) << "lseek header failed";
        return false;
    }
    return android::base::ReadFully(fd, header, header->prefix.header_size);
}

CowReader::CowReader(ReaderFlags reader_flag, bool is_merge)
    : fd_(-1),
      header_(),
+0 −29
Original line number Diff line number Diff line
@@ -23,35 +23,6 @@ namespace snapshot {

using android::base::borrowed_fd;

bool ReadCowHeader(android::base::borrowed_fd fd, CowHeader* header) {
    if (lseek(fd.get(), 0, SEEK_SET) < 0) {
        PLOG(ERROR) << "lseek header failed";
        return false;
    }

    memset(header, 0, sizeof(*header));

    if (!android::base::ReadFully(fd, &header->prefix, sizeof(header->prefix))) {
        return false;
    }
    if (header->prefix.magic != kCowMagicNumber) {
        LOG(ERROR) << "Header Magic corrupted. Magic: " << header->prefix.magic
                   << "Expected: " << kCowMagicNumber;
        return false;
    }
    if (header->prefix.header_size > sizeof(CowHeader)) {
        LOG(ERROR) << "Unknown CowHeader size (got " << header->prefix.header_size
                   << " bytes, expected at most " << sizeof(CowHeader) << " bytes)";
        return false;
    }

    if (lseek(fd.get(), 0, SEEK_SET) < 0) {
        PLOG(ERROR) << "lseek header failed";
        return false;
    }
    return android::base::ReadFully(fd, header, header->prefix.header_size);
}

bool CowParserV2::Parse(borrowed_fd fd, const CowHeader& header, std::optional<uint64_t> label) {
    auto pos = lseek(fd.get(), 0, SEEK_END);
    if (pos < 0) {
+0 −2
Original line number Diff line number Diff line
@@ -49,7 +49,5 @@ class CowParserV2 {
    std::optional<uint64_t> last_label_;
};

bool ReadCowHeader(android::base::borrowed_fd fd, CowHeader* header);

}  // namespace snapshot
}  // namespace android