From c99f4a591bc81225986e701d98ef0a60fc767cea Mon Sep 17 00:00:00 2001 From: LoveSy Date: Thu, 30 Jan 2025 20:43:47 +0800 Subject: [PATCH] Move MagiskInit::exec_init to rust --- native/src/init/lib.rs | 4 ++-- native/src/init/mount.cpp | 11 ----------- native/src/init/mount.rs | 33 ++++++++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/native/src/init/lib.rs b/native/src/init/lib.rs index b0214fcae..732b16127 100644 --- a/native/src/init/lib.rs +++ b/native/src/init/lib.rs @@ -55,9 +55,10 @@ pub mod ffi { fn reset_overlay_contexts(); unsafe fn start_magisk_init(argv: *mut *mut c_char); } - + extern "Rust" { fn prepare_data(self: &MagiskInit); + fn exec_init(self: &MagiskInit); } unsafe extern "C++" { @@ -90,7 +91,6 @@ pub mod ffi { // SELinux unsafe fn patch_sepolicy(self: &MagiskInit, in_: *const c_char, out: *const c_char); fn hijack_sepolicy(self: &mut MagiskInit) -> bool; - fn exec_init(self: &MagiskInit); fn legacy_system_as_root(self: &mut MagiskInit); fn rootfs(self: &mut MagiskInit); fn start(self: &mut MagiskInit); diff --git a/native/src/init/mount.cpp b/native/src/init/mount.cpp index 5e4b0b085..852affa5c 100644 --- a/native/src/init/mount.cpp +++ b/native/src/init/mount.cpp @@ -210,17 +210,6 @@ mount_root: return is_two_stage; } -void MagiskInit::exec_init() const noexcept { - // Unmount in reverse order - for (auto i = mount_list.size(); i > 0; --i) { - auto &p = mount_list[i - 1]; - if (xumount2(p.data(), MNT_DETACH) == 0) - LOGD("Unmount [%s]\n", p.data()); - } - execve("/init", argv, environ); - exit(1); -} - void MagiskInit::setup_tmp(const char *path) const noexcept { LOGD("Setup Magisk tmp at %s\n", path); chdir("/data"); diff --git a/native/src/init/mount.rs b/native/src/init/mount.rs index 37139110a..ecac7252c 100644 --- a/native/src/init/mount.rs +++ b/native/src/init/mount.rs @@ -1,3 +1,4 @@ +use cxx::CxxString; use std::{ collections::BTreeSet, ops::Bound::{Excluded, Unbounded}, @@ -5,15 +6,18 @@ use std::{ ptr::null as nullptr, }; -use cxx::CxxString; - use crate::ffi::MagiskInit; use base::{ - cstr, debug, - libc::{chdir, chroot, mount, MS_MOVE}, - parse_mount_info, raw_cstr, Directory, FsPath, LibcReturn, LoggedResult, StringExt, Utf8CStr, + cstr, debug, libc, + libc::{chdir, chroot, execve, exit, mount, umount2, MNT_DETACH, MS_MOVE}, + parse_mount_info, raw_cstr, Directory, FsPath, LibcReturn, LoggedResult, ResultExt, StringExt, + Utf8CStr, }; +extern "C" { + static environ: *const *mut libc::c_char; +} + pub fn switch_root(path: &Utf8CStr) { let res: LoggedResult<()> = try { debug!("Switch root to {}", path); @@ -94,4 +98,23 @@ impl MagiskInit { } inner().ok(); } + + pub(crate) fn exec_init(&self) { + unsafe { + for p in self.mount_list.iter().rev() { + if umount2(p.as_ptr().cast(), MNT_DETACH) + .as_os_err() + .log() + .is_ok() + { + debug!("Unmount [{}]", p); + } + } + execve(raw_cstr!("/init"), self.argv.cast(), environ.cast()) + .as_os_err() + .log() + .ok(); + exit(1); + } + } }