mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-02-22 20:08:30 +00:00
Revert DTB fstab changes
This commit is contained in:
parent
76061296c9
commit
b100d0c503
@ -27,6 +27,6 @@ android.injected.testOnly=false
|
|||||||
kapt.incremental.apt=true
|
kapt.incremental.apt=true
|
||||||
|
|
||||||
# Magisk
|
# Magisk
|
||||||
magisk.versionCode=21201
|
magisk.versionCode=21202
|
||||||
magisk.ndkVersion=21d
|
magisk.ndkVersion=21d
|
||||||
magisk.fullNdkVersion=21.3.6528147
|
magisk.fullNdkVersion=21.3.6528147
|
||||||
|
@ -57,13 +57,39 @@ void FirstStageInit::prepare() {
|
|||||||
}
|
}
|
||||||
exit_loop:
|
exit_loop:
|
||||||
|
|
||||||
if (fstab_file[0] == '\0') {
|
// Try to load dt fstab
|
||||||
LOGI("Cannot find fstab file in ramdisk!\n");
|
vector<fstab_entry> fstab;
|
||||||
return;
|
read_dt_fstab(fstab);
|
||||||
|
|
||||||
|
if (!fstab.empty()) {
|
||||||
|
// Dump dt fstab to fstab file in rootfs and force init to use it instead
|
||||||
|
|
||||||
|
// All dt fstab entries should be first_stage_mount
|
||||||
|
for (auto &entry : fstab) {
|
||||||
|
if (!str_contains(entry.fsmgr_flags, "first_stage_mount")) {
|
||||||
|
if (!entry.fsmgr_flags.empty())
|
||||||
|
entry.fsmgr_flags += ',';
|
||||||
|
entry.fsmgr_flags += "first_stage_mount";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse and load fstab file
|
if (fstab_file[0] == '\0') {
|
||||||
vector<fstab_entry> fstab;
|
const char *suffix =
|
||||||
|
cmd->fstab_suffix[0] ? cmd->fstab_suffix :
|
||||||
|
(cmd->hardware[0] ? cmd->hardware :
|
||||||
|
(cmd->hardware_plat[0] ? cmd->hardware_plat : nullptr));
|
||||||
|
if (suffix == nullptr) {
|
||||||
|
LOGE("Cannot determine fstab suffix!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sprintf(fstab_file, "fstab.%s", suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Patch init to force IsDtFstabCompatible() return false
|
||||||
|
auto init = mmap_data::rw("/init");
|
||||||
|
init.patch({ make_pair("android,fstab", "xxx") });
|
||||||
|
} else {
|
||||||
|
// Parse and load the fstab file
|
||||||
file_readline(fstab_file, [&](string_view l) -> bool {
|
file_readline(fstab_file, [&](string_view l) -> bool {
|
||||||
if (l[0] == '#' || l.length() == 1)
|
if (l[0] == '#' || l.length() == 1)
|
||||||
return true;
|
return true;
|
||||||
@ -87,6 +113,7 @@ exit_loop:
|
|||||||
fstab.emplace_back(std::move(entry));
|
fstab.emplace_back(std::move(entry));
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
LOGD("Write fstab file: %s\n", fstab_file);
|
LOGD("Write fstab file: %s\n", fstab_file);
|
||||||
|
@ -124,52 +124,37 @@ static void dtb_print(const char *file, bool fstab) {
|
|||||||
munmap(dtb, size);
|
munmap(dtb, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[maybe_unused]]
|
||||||
static bool dtb_patch_rebuild(uint8_t *dtb, size_t dtb_sz, const char *file);
|
static bool dtb_patch_rebuild(uint8_t *dtb, size_t dtb_sz, const char *file);
|
||||||
|
|
||||||
static bool dtb_patch(const char *file) {
|
static bool dtb_patch(const char *file) {
|
||||||
bool keep_verity = check_env("KEEPVERITY");
|
bool keep_verity = check_env("KEEPVERITY");
|
||||||
bool have_system = false;
|
|
||||||
vector<pair<char *, int>> flags_list;
|
|
||||||
|
|
||||||
size_t size;
|
size_t size;
|
||||||
uint8_t *dtb;
|
uint8_t *dtb;
|
||||||
fprintf(stderr, "Loading dtbs from [%s]\n", file);
|
fprintf(stderr, "Loading dtbs from [%s]\n", file);
|
||||||
mmap_rw(file, dtb, size);
|
mmap_rw(file, dtb, size);
|
||||||
run_finally f([=]{ munmap(dtb, size); });
|
|
||||||
|
|
||||||
// First traverse through DTB to determine whether we need a rebuild
|
bool patched = false;
|
||||||
int dtb_num = 0;
|
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
if (memcmp(dtb + i, FDT_MAGIC_STR, 4) == 0) {
|
if (memcmp(dtb + i, FDT_MAGIC_STR, 4) == 0) {
|
||||||
auto fdt = dtb + i;
|
auto fdt = dtb + i;
|
||||||
if (int fstab = find_fstab(fdt); fstab >= 0) {
|
if (int fstab = find_fstab(fdt); fstab >= 0) {
|
||||||
int node;
|
int node;
|
||||||
fdt_for_each_subnode(node, fdt, fstab) {
|
fdt_for_each_subnode(node, fdt, fstab) {
|
||||||
const char *name = fdt_get_name(fdt, node, nullptr);
|
|
||||||
if (!keep_verity) {
|
if (!keep_verity) {
|
||||||
int len;
|
int len;
|
||||||
char *value = (char *) fdt_getprop(fdt, node, "fsmgr_flags", &len);
|
char *value = (char *) fdt_getprop(fdt, node, "fsmgr_flags", &len);
|
||||||
flags_list.emplace_back(value, len);
|
patched |= patch_verity(value, len) != len;
|
||||||
}
|
}
|
||||||
if (name == "system"sv)
|
|
||||||
have_system = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i += fdt_totalsize(fdt) - 1;
|
i += fdt_totalsize(fdt) - 1;
|
||||||
++dtb_num;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!have_system) {
|
munmap(dtb, size);
|
||||||
// Patch in place with rw mmap
|
|
||||||
bool patched = false;
|
|
||||||
for (auto &[value, len] : flags_list)
|
|
||||||
patched |= patch_verity(value, len) != len;
|
|
||||||
return patched;
|
return patched;
|
||||||
} else {
|
|
||||||
// Need to rebuild dtb due to additional props
|
|
||||||
return dtb_patch_rebuild(dtb, size, file);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int dtb_commands(int argc, char *argv[]) {
|
int dtb_commands(int argc, char *argv[]) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user