diff --git a/native/jni/init/early_mount.cpp b/native/jni/init/early_mount.cpp index 3930e2ac7..2826b97ef 100644 --- a/native/jni/init/early_mount.cpp +++ b/native/jni/init/early_mount.cpp @@ -115,6 +115,12 @@ void LegacyInit::early_mount() { char fstype[32]; char block_dev[64]; + full_read("/init", &self.buf, &self.sz); + + LOGD("Reverting /init\n"); + root = xopen("/", O_RDONLY | O_CLOEXEC); + rename("/.backup/init", "/init"); + mount_root(system); mount_root(vendor); mount_root(product); @@ -126,6 +132,12 @@ void SARCompatInit::early_mount() { char fstype[32]; char block_dev[64]; + full_read("/init", &self.buf, &self.sz); + + LOGD("Cleaning rootfs\n"); + root = xopen("/", O_RDONLY | O_CLOEXEC); + frm_rf(root, { ".backup", "overlay", "proc", "sys" }); + LOGD("Early mount system_root\n"); sprintf(partname, "system%s", cmd->slot); setup_block(partname, block_dev); @@ -164,6 +176,14 @@ static void switch_root(const string &path) { void SARInit::early_mount() { char partname[32]; + full_read("/init", &self.buf, &self.sz); + full_read("/.backup/.magisk", &config.buf, &config.sz); + + LOGD("Cleaning rootfs\n"); + int root = xopen("/", O_RDONLY | O_CLOEXEC); + frm_rf(root, { "proc", "sys" }); + close(root); + LOGD("Early mount system_root\n"); sprintf(partname, "system%s", cmd->slot); system_dev = setup_block(partname); diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index 13f6a3f87..7d3df0d1d 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -124,40 +124,13 @@ void BaseInit::re_exec_init() { exit(1); } -void LegacyInit::preset() { - full_read("/init", &self.buf, &self.sz); - - LOGD("Reverting /init\n"); - root = open("/", O_RDONLY | O_CLOEXEC); - rename("/.backup/init", "/init"); -} - -void SARInit::preset() { - full_read("/init", &self.buf, &self.sz); - full_read("/.backup/.magisk", &config.buf, &config.sz); - - LOGD("Cleaning rootfs\n"); - root = open("/", O_RDONLY | O_CLOEXEC); - frm_rf(root, { "proc", "sys" }); -} - -void SARCompatInit::preset() { - full_read("/init", &self.buf, &self.sz); - - LOGD("Cleaning rootfs\n"); - root = open("/", O_RDONLY | O_CLOEXEC); - frm_rf(root, { ".backup", "overlay", "proc", "sys" }); -} - void RootFSInit::start() { - preset(); early_mount(); setup_rootfs(); re_exec_init(); } void SARInit::start() { - preset(); early_mount(); patch_rootdir(); re_exec_init(); @@ -178,8 +151,8 @@ class TestInit : public SARInit { public: TestInit(char *argv[], cmdline *cmd) : SARInit(argv, cmd) {}; void start() override { - preset(); early_mount(); + patch_rootdir(); cleanup(); } }; diff --git a/native/jni/init/init.h b/native/jni/init/init.h index ae7d2835f..34a11bf71 100644 --- a/native/jni/init/init.h +++ b/native/jni/init/init.h @@ -26,13 +26,11 @@ public: class MagiskInit : public BaseInit { protected: raw_data self{}; - int root = -1; bool mnt_system = false; bool mnt_vendor = false; bool mnt_product = false; bool mnt_odm = false; - virtual void preset() = 0; virtual void early_mount() = 0; bool read_dt_fstab(const char *name, char *partname, char *fstype); bool patch_sepolicy(); @@ -46,7 +44,6 @@ protected: raw_data config{}; dev_t system_dev; - void preset() override; void early_mount() override; void patch_rootdir(); public: @@ -56,7 +53,9 @@ public: class RootFSInit : public MagiskInit { protected: - void setup_rootfs(); + int root = -1; + + virtual void setup_rootfs(); public: RootFSInit(char *argv[], cmdline *cmd) : MagiskInit(argv, cmd) {}; void start() override; @@ -64,7 +63,6 @@ public: class LegacyInit : public RootFSInit { protected: - void preset() override; void early_mount() override; public: LegacyInit(char *argv[], cmdline *cmd) : RootFSInit(argv, cmd) {}; @@ -72,8 +70,8 @@ public: class SARCompatInit : public RootFSInit { protected: - void preset() override; void early_mount() override; + void setup_rootfs() override; public: SARCompatInit(char *argv[], cmdline *cmd) : RootFSInit(argv, cmd) {}; }; diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index 78a58ba8c..f1faa9f59 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -40,14 +40,6 @@ constexpr const char wrapper[] = ; void RootFSInit::setup_rootfs() { - if (cmd->system_as_root) { - // Clone rootfs - LOGD("Clone root dir from system to rootfs\n"); - int system_root = xopen("/system_root", O_RDONLY | O_CLOEXEC); - clone_dir(system_root, root, false); - close(system_root); - } - if (patch_sepolicy()) { constexpr char SYSTEM_INIT[] = "/system/bin/init"; // If init is symlink, copy it to rootfs so we can patch @@ -131,6 +123,16 @@ void RootFSInit::setup_rootfs() { close(fd); } +void SARCompatInit::setup_rootfs() { + // Clone rootfs + LOGD("Clone root dir from system to rootfs\n"); + int system_root = xopen("/system_root", O_RDONLY | O_CLOEXEC); + clone_dir(system_root, root, false); + close(system_root); + + RootFSInit::setup_rootfs(); +} + bool MagiskInit::patch_sepolicy() { bool patch_init = false;