diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index db366eb83..97d8f3ac2 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -56,7 +56,7 @@ static int dump_manager(const char *path, mode_t mode) { class RecoveryInit : public BaseInit { public: - RecoveryInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {} + using BaseInit::BaseInit; void start() override { LOGD("Ramdisk is recovery, abort\n"); rename(backup_init(), "/init"); @@ -144,14 +144,13 @@ int main(int argc, char *argv[]) { BootConfig config{}; if (argc > 1 && argv[1] == "selinux_setup"sv) { - setup_klog(); init = new SecondStageInit(argv); } else { // This will also mount /sys and /proc load_kernel_info(&config); if (config.skip_initramfs) - init = new SARInit(argv, &config); + init = new LegacySARInit(argv, &config); else if (config.force_normal_boot) init = new FirstStageInit(argv, &config); else if (access("/sbin/recovery", F_OK) == 0 || access("/system/bin/recovery", F_OK) == 0) diff --git a/native/jni/init/init.hpp b/native/jni/init/init.hpp index 314410c09..64ea90646 100644 --- a/native/jni/init/init.hpp +++ b/native/jni/init/init.hpp @@ -59,7 +59,7 @@ protected: [[noreturn]] void exec_init(); void read_dt_fstab(std::vector &fstab); public: - BaseInit(char *argv[], BootConfig *config) : config(config), argv(argv) {} + BaseInit(char *argv[], BootConfig *config = nullptr) : config(config), argv(argv) {} virtual ~BaseInit() = default; virtual void start() = 0; }; @@ -67,7 +67,7 @@ public: class MagiskInit : public BaseInit { protected: mmap_data self; - mmap_data magisk_config; + mmap_data magisk_cfg; std::string custom_rules_dir; #if ENABLE_AVD_HACK @@ -83,19 +83,20 @@ protected: bool patch_sepolicy(const char *file); void setup_tmp(const char *path); void mount_rules_dir(const char *dev_base, const char *mnt_base); + void patch_rw_root(); public: - MagiskInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {} + using BaseInit::BaseInit; }; -class SARBase : virtual public MagiskInit { +class SARBase : public MagiskInit { protected: std::vector overlays; void backup_files(); - void patch_rootdir(); + void patch_ro_root(); void mount_system_root(); public: - SARBase() = default; + using MagiskInit::MagiskInit; }; /*************** @@ -106,7 +107,7 @@ class FirstStageInit : public BaseInit { private: void prepare(); public: - FirstStageInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) { + FirstStageInit(char *argv[], BootConfig *config) : BaseInit(argv, config) { LOGD("%s\n", __FUNCTION__); }; void start() override { @@ -115,23 +116,41 @@ public: } }; +class SecondStageInit : public SARBase { +private: + bool prepare(); +public: + SecondStageInit(char *argv[]) : SARBase(argv) { + setup_klog(); + LOGD("%s\n", __FUNCTION__); + }; + + void start() override { + if (prepare()) + patch_rw_root(); + else + patch_ro_root(); + exec_init(); + } +}; + /************* * Legacy SAR *************/ -class SARInit : public SARBase { +class LegacySARInit : public SARBase { private: bool early_mount(); void first_stage_prep(); public: - SARInit(char *argv[], BootConfig *cmd) : MagiskInit(argv, cmd) { + LegacySARInit(char *argv[], BootConfig *config) : SARBase(argv, config) { LOGD("%s\n", __FUNCTION__); }; void start() override { if (early_mount()) first_stage_prep(); else - patch_rootdir(); + patch_ro_root(); exec_init(); } }; @@ -140,50 +159,23 @@ public: * Initramfs ************/ -class RootFSBase : virtual public MagiskInit { -protected: - void patch_rootfs(); -public: - RootFSBase() = default; - void start() = 0; -}; - -class RootFSInit : public RootFSBase { +class RootFSInit : public MagiskInit { private: void early_mount(); - public: - RootFSInit(char *argv[], BootConfig *cmd) : MagiskInit(argv, cmd) { + RootFSInit(char *argv[], BootConfig *config) : MagiskInit(argv, config) { LOGD("%s\n", __FUNCTION__); } void start() override { early_mount(); - patch_rootfs(); + patch_rw_root(); exec_init(); } }; -class SecondStageInit : public RootFSBase, public SARBase { -private: - bool prepare(); -public: - SecondStageInit(char *argv[]) : MagiskInit(argv, nullptr) { - LOGD("%s\n", __FUNCTION__); - }; - - void start() override { - if (prepare()) - patch_rootfs(); - else - patch_rootdir(); - exec_init(); - } -}; - - class MagiskProxy : public MagiskInit { public: - explicit MagiskProxy(char *argv[]) : MagiskInit(argv, nullptr) { + explicit MagiskProxy(char *argv[]) : MagiskInit(argv) { LOGD("%s\n", __FUNCTION__); } void start() override; diff --git a/native/jni/init/mount.cpp b/native/jni/init/mount.cpp index 6f6ee1955..0f4af83c3 100644 --- a/native/jni/init/mount.cpp +++ b/native/jni/init/mount.cpp @@ -311,9 +311,9 @@ void SARBase::backup_files() { self = mmap_data("/proc/self/exe"); if (access("/.backup/.magisk", R_OK) == 0) - magisk_config = mmap_data("/.backup/.magisk"); + magisk_cfg = mmap_data("/.backup/.magisk"); else if (access("/data/.backup/.magisk", R_OK) == 0) - magisk_config = mmap_data("/data/.backup/.magisk"); + magisk_cfg = mmap_data("/data/.backup/.magisk"); } void SARBase::mount_system_root() { @@ -350,7 +350,7 @@ mount_root: xmount("/dev/root", "/system_root", "erofs", MS_RDONLY, nullptr); } -bool SARInit::early_mount() { +bool LegacySARInit::early_mount() { backup_files(); mount_system_root(); switch_root("/system_root"); @@ -394,7 +394,7 @@ void MagiskInit::setup_tmp(const char *path) { xmkdir(BLOCKDIR, 0); int fd = xopen(INTLROOT "/config", O_WRONLY | O_CREAT, 0); - xwrite(fd, magisk_config.buf, magisk_config.sz); + xwrite(fd, magisk_cfg.buf, magisk_cfg.sz); close(fd); fd = xopen("magiskinit", O_WRONLY | O_CREAT, 0755); xwrite(fd, self.buf, self.sz); diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index acb031a5b..740068736 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -202,7 +202,7 @@ static void patch_socket_name(const char *path) { #define MONOPOLICY "/sepolicy" #define NEW_INITRC "/system/etc/init/hw/init.rc" -void SARBase::patch_rootdir() { +void SARBase::patch_ro_root() { string tmp_dir; const char *sepol; @@ -327,7 +327,7 @@ void SARBase::patch_rootdir() { #define TMP_MNTDIR "/dev/mnt" #define TMP_RULESDIR "/.backup/.sepolicy.rules" -void RootFSBase::patch_rootfs() { +void MagiskInit::patch_rw_root() { // Create hardlink mirror of /sbin to /root mkdir("/root", 0777); clone_attr("/sbin", "/root"); @@ -378,7 +378,7 @@ void MagiskProxy::start() { // Backup stuffs before removing them self = mmap_data("/sbin/magisk"); - magisk_config = mmap_data("/.backup/.magisk"); + magisk_cfg = mmap_data("/.backup/.magisk"); auto magisk = mmap_data("/sbin/magisk32.xz"); auto magisk64 = mmap_data("/sbin/magisk64.xz"); char custom_rules_dir[64]; diff --git a/native/jni/init/twostage.cpp b/native/jni/init/twostage.cpp index 8a1db385a..39903fd5d 100644 --- a/native/jni/init/twostage.cpp +++ b/native/jni/init/twostage.cpp @@ -30,7 +30,7 @@ void FirstStageInit::prepare() { cp_afc("overlay.d", "/data/overlay.d"); } -void SARInit::first_stage_prep() { +void LegacySARInit::first_stage_prep() { xmount("tmpfs", "/data", "tmpfs", 0, "mode=755"); // Patch init binary @@ -57,7 +57,7 @@ void SARInit::first_stage_prep() { xmkdir("/data/overlay.d", 0); restore_folder("/data/overlay.d", overlays); int cfg = xopen("/data/.backup/config", O_WRONLY | O_CREAT, 0); - xwrite(cfg, magisk_config.buf, magisk_config.sz); + xwrite(cfg, magisk_cfg.buf, magisk_cfg.sz); close(cfg); }