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

Commit 042f2da1 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "fs_mgr: overlayfs deal with verity detection issues"

parents 8ddded2f 54e47908
Loading
Loading
Loading
Loading
+43 −17
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include <sys/vfs.h>
#include <unistd.h>

#include <algorithm>
#include <map>
#include <memory>
#include <string>
@@ -42,10 +43,12 @@
#include <ext4_utils/ext4_utils.h>
#include <fs_mgr_overlayfs.h>
#include <fstab/fstab.h>
#include <libdm/dm.h>

#include "fs_mgr_priv.h"

using namespace std::literals;
using namespace android::dm;

#if ALLOW_ADBD_DISABLE_VERITY == 0  // If we are a user build, provide stubs

@@ -222,13 +225,12 @@ bool fs_mgr_overlayfs_already_mounted(const std::string& mount_point) {
    return false;
}

bool fs_mgr_overlayfs_verity_enabled(const std::string& basename_mount_point) {
    auto found = false;
    fs_mgr_update_verity_state(
            [&basename_mount_point, &found](fstab_rec*, const char* mount_point, int, int) {
                if (mount_point && (basename_mount_point == mount_point)) found = true;
std::vector<std::string> fs_mgr_overlayfs_verity_enabled_list() {
    std::vector<std::string> ret;
    fs_mgr_update_verity_state([&ret](fstab_rec*, const char* mount_point, int, int) {
        ret.emplace_back(mount_point);
    });
    return found;
    return ret;
}

bool fs_mgr_wants_overlayfs(const fstab_rec* fsrec) {
@@ -254,7 +256,7 @@ bool fs_mgr_wants_overlayfs(const fstab_rec* fsrec) {

    if (!fs_mgr_overlayfs_enabled(fsrec)) return false;

    return !fs_mgr_overlayfs_verity_enabled(android::base::Basename(fsrec_mount_point));
    return true;
}

bool fs_mgr_rm_all(const std::string& path, bool* change = nullptr) {
@@ -445,11 +447,16 @@ std::vector<std::string> fs_mgr_candidate_list(const fstab* fstab,
    std::vector<std::string> mounts;
    if (!fstab) return mounts;

    auto verity = fs_mgr_overlayfs_verity_enabled_list();
    for (auto i = 0; i < fstab->num_entries; i++) {
        const auto fsrec = &fstab->recs[i];
        if (!fs_mgr_wants_overlayfs(fsrec)) continue;
        std::string new_mount_point(fs_mgr_mount_point(fstab, fsrec->mount_point));
        if (mount_point && (new_mount_point != mount_point)) continue;
        if (std::find(verity.begin(), verity.end(), android::base::Basename(new_mount_point)) !=
            verity.end()) {
            continue;
        }
        auto duplicate_or_more_specific = false;
        for (auto it = mounts.begin(); it != mounts.end();) {
            if ((*it == new_mount_point) ||
@@ -465,16 +472,35 @@ std::vector<std::string> fs_mgr_candidate_list(const fstab* fstab,
        }
        if (!duplicate_or_more_specific) mounts.emplace_back(new_mount_point);
    }
    // if not itemized /system or /, system as root, fake up
    // fs_mgr_wants_overlayfs evaluation of /system as candidate.

    if ((std::find(mounts.begin(), mounts.end(), "/system") == mounts.end()) &&
        !fs_mgr_get_entry_for_mount_point(const_cast<struct fstab*>(fstab), "/") &&
        !fs_mgr_get_entry_for_mount_point(const_cast<struct fstab*>(fstab), "/system") &&
        (!mount_point || ("/system"s == mount_point)) &&
        !fs_mgr_overlayfs_verity_enabled("system")) {
        mounts.emplace_back("/system");
    // if not itemized /system or /, system as root, fake one up?

    // do we want or need to?
    if (mount_point && ("/system"s != mount_point)) return mounts;
    if (std::find(mounts.begin(), mounts.end(), "/system") != mounts.end()) return mounts;

    // fs_mgr_overlayfs_verity_enabled_list says not to?
    if (std::find(verity.begin(), verity.end(), "system") != verity.end()) return mounts;

    // confirm that fstab is missing system
    if (fs_mgr_get_entry_for_mount_point(const_cast<struct fstab*>(fstab), "/")) {
        return mounts;
    }
    if (fs_mgr_get_entry_for_mount_point(const_cast<struct fstab*>(fstab), "/system")) {
        return mounts;
    }

    // Manually check dm state because stunted fstab (w/o system as root) borken
    auto& dm = DeviceMapper::Instance();
    auto found = false;
    for (auto& system : {"system", "vroot"}) {
        if (dm.GetState(system) == DmDeviceState::INVALID) continue;
        std::vector<DeviceMapper::TargetInfo> table;
        found = !dm.GetTableStatus(system, &table) || table.empty() || table[0].data.empty() ||
                (table[0].data[0] == 'C') || (table[0].data[0] == 'V');
        if (found) break;
    }
    if (!found) mounts.emplace_back("/system");
    return mounts;
}