diff --git a/native/src/base/mount.rs b/native/src/base/mount.rs index 62bdd0845..4c0dc7818 100644 --- a/native/src/base/mount.rs +++ b/native/src/base/mount.rs @@ -1,5 +1,4 @@ -use crate::WalkResult::{Continue, Skip}; -use crate::{Directory, LibcReturn, OsResult, ResultExt, Utf8CStr, Utf8CStrBufArr}; +use crate::{LibcReturn, OsResult, Utf8CStr}; use nix::mount::{MntFlags, MsFlags, mount, umount2}; impl Utf8CStr { @@ -82,52 +81,4 @@ impl Utf8CStr { ) .check_os_err("set_mount_private", Some(self), None) } - - pub fn occupy(&self) { - Directory::open(self) - .map(|mut dir| { - dir.pre_order_walk(|entry| { - let mut path = Utf8CStrBufArr::default(); - entry.resolve_path(&mut path)?; - let path = path.as_utf8_cstr(); - mount( - Some(path), - path, - None::<&Utf8CStr>, - MsFlags::MS_BIND | MsFlags::MS_RDONLY, - None::<&Utf8CStr>, - ) - .check_os_err("occupy", Some(path), None)?; - Ok(Continue) - }) - .log_ok(); - }) - .log_ok(); - } - - pub fn unoccupy(&self) -> bool { - let mut ok = false; - Directory::open(self) - .map(|mut dir| { - ok = dir - .pre_order_walk(|entry| { - let mut path = Utf8CStrBufArr::default(); - entry.resolve_path(&mut path)?; - let path = path.as_utf8_cstr(); - umount2(path, MntFlags::MNT_DETACH).check_os_err( - "unoccupy", - Some(path), - None, - )?; - if entry.is_dir() { - Ok(Skip) - } else { - Ok(Continue) - } - }) - .is_ok(); - }) - .log_ok(); - ok - } } diff --git a/native/src/init/init.rs b/native/src/init/init.rs index 600730d31..4a9a8c537 100644 --- a/native/src/init/init.rs +++ b/native/src/init/init.rs @@ -1,6 +1,6 @@ use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main}; use crate::logging::setup_klog; -use crate::mount::is_rootfs; +use crate::mount::{is_rootfs, occupy, unoccupy}; use crate::twostage::hexpatch_init_for_second_stage; use base::libc::{basename, getpid, mount, umask}; use base::nix::mount::MsFlags; @@ -44,15 +44,15 @@ impl MagiskInit { } if rootfs_magisktmp { - info!("Occupy /data."); - cstr!("/data").occupy(); + info!("Occupy /data"); + occupy(cstr!("/data")); } } fn second_stage(&mut self) { info!("Second Stage Init"); - if cstr!("/data").unoccupy() { + if unoccupy(cstr!("/data")) { nix::mount::mount( None::<&Utf8CStr>, cstr!("/data"), diff --git a/native/src/init/mount.rs b/native/src/init/mount.rs index d29c94288..2f317fc20 100644 --- a/native/src/init/mount.rs +++ b/native/src/init/mount.rs @@ -1,4 +1,6 @@ use crate::ffi::MagiskInit; +use base::WalkResult::{Continue, Skip}; +use base::nix::mount::{MntFlags, mount, umount2}; use base::{ Directory, FsPathBuilder, LibcReturn, LoggedResult, ResultExt, Utf8CStr, cstr, debug, libc, nix, parse_mount_info, raw_cstr, @@ -62,6 +64,54 @@ pub(crate) fn is_device_mounted(dev: u64, target: Pin<&mut CxxString>) -> bool { false } +pub(crate) fn occupy(path: &Utf8CStr) { + Directory::open(path) + .map(|mut dir| { + dir.pre_order_walk(|entry| { + let mut path = cstr::buf::default(); + entry.resolve_path(&mut path)?; + let path = path.as_utf8_cstr(); + mount( + Some(path), + path, + None::<&Utf8CStr>, + MsFlags::MS_BIND | MsFlags::MS_RDONLY, + None::<&Utf8CStr>, + ) + .check_os_err("occupy", Some(path), None)?; + Ok(Continue) + }) + .log_ok(); + }) + .log_ok(); +} + +pub(crate) fn unoccupy(path: &Utf8CStr) -> bool { + let mut ok = false; + Directory::open(path) + .map(|mut dir| { + ok = dir + .pre_order_walk(|entry| { + let mut path = cstr::buf::default(); + entry.resolve_path(&mut path)?; + let path = path.as_utf8_cstr(); + umount2(path, MntFlags::MNT_DETACH).check_os_err( + "unoccupy", + Some(path), + None, + )?; + if entry.is_dir() { + Ok(Skip) + } else { + Ok(Continue) + } + }) + .is_ok(); + }) + .log_ok(); + ok +} + const RAMFS_MAGIC: u32 = 0x858458f6; pub(crate) fn is_rootfs() -> bool {