diff --git a/native/src/core/lib.rs b/native/src/core/lib.rs index d479f2f74..521e1da21 100644 --- a/native/src/core/lib.rs +++ b/native/src/core/lib.rs @@ -9,7 +9,7 @@ use daemon::{daemon_entry, find_apk_path, get_magiskd, MagiskD}; use logging::{ android_logging, magisk_logging, zygisk_close_logd, zygisk_get_logd, zygisk_logging, }; -use mount::{find_preinit_device, revert_unmount, setup_mounts}; +use mount::{find_preinit_device, revert_unmount, setup_mounts, clean_mounts}; use resetprop::{persist_delete_prop, persist_get_prop, persist_get_props, persist_set_prop}; mod cert; @@ -92,6 +92,7 @@ pub mod ffi { fn find_apk_path(pkg: Utf8CStrRef, data: &mut [u8]) -> usize; fn read_certificate(fd: i32, version: i32) -> Vec; fn setup_mounts(); + fn clean_mounts(); fn find_preinit_device() -> String; fn revert_unmount(pid: i32); unsafe fn persist_get_prop(name: Utf8CStrRef, prop_cb: Pin<&mut PropCb>); diff --git a/native/src/core/module.cpp b/native/src/core/module.cpp index dfa31da83..c9f08b7ed 100644 --- a/native/src/core/module.cpp +++ b/native/src/core/module.cpp @@ -157,11 +157,9 @@ void tmpfs_node::mount() { if (!isa(parent())) { auto worker_dir = worker_path(); mkdirs(worker_dir.data(), 0); - bind_mount("tmpfs", worker_dir.data(), worker_dir.data()); clone_attr(exist() ? node_path().data() : parent()->node_path().data(), worker_dir.data()); dir_node::mount(); - VLOGD(replace() ? "replace" : "move", worker_dir.data(), node_path().data()); - xmount(worker_dir.data(), node_path().data(), nullptr, MS_MOVE, nullptr); + bind_mount(replace() ? "replace" : "move", worker_dir.data(), node_path().data()); xmount(nullptr, node_path().data(), nullptr, MS_REMOUNT | MS_BIND | MS_RDONLY, nullptr); } else { const string dest = worker_path(); @@ -333,10 +331,7 @@ void load_modules() { } // cleanup mounts - ssprintf(buf, sizeof(buf), "%s/" WORKERDIR, get_magisk_tmp()); - xumount2(buf, MNT_DETACH); - ssprintf(buf, sizeof(buf), "%s/" MODULEMNT, get_magisk_tmp()); - xumount2(buf, MNT_DETACH); + clean_mounts(); } /************************ diff --git a/native/src/core/mount.rs b/native/src/core/mount.rs index 2a1e1b9db..344b6e658 100644 --- a/native/src/core/mount.rs +++ b/native/src/core/mount.rs @@ -94,36 +94,40 @@ pub fn setup_mounts() { ptr::null(), ) .as_os_err()?; - libc::mount( - ptr::null(), + } + }; +} + +pub fn clean_mounts() { + let magisk_tmp = get_magisk_tmp(); + + let mut buf = Utf8CStrBufArr::default(); + + let module_mnt = FsPathBuf::new(&mut buf).join(magisk_tmp).join(MODULEMNT); + let _: LoggedResult<()> = try { + unsafe { + libc::umount2( module_mnt.as_ptr(), - ptr::null(), - libc::MS_PRIVATE, - ptr::null(), + libc::MNT_DETACH, ) .as_os_err()?; } }; - // Prepare worker let worker_dir = FsPathBuf::new(&mut buf).join(magisk_tmp).join(WORKERDIR); let _: LoggedResult<()> = try { - worker_dir.mkdir(0)?; unsafe { libc::mount( - worker_dir.as_ptr(), + ptr::null(), worker_dir.as_ptr(), ptr::null(), - libc::MS_BIND, + libc::MS_PRIVATE | libc::MS_REC, ptr::null(), ) .as_os_err()?; - libc::mount( - ptr::null(), + libc::umount2( worker_dir.as_ptr(), - ptr::null(), - libc::MS_PRIVATE, - ptr::null(), + libc::MNT_DETACH, ) .as_os_err()?; } diff --git a/native/src/init/mount.cpp b/native/src/init/mount.cpp index 23c187dc8..93d437774 100644 --- a/native/src/init/mount.cpp +++ b/native/src/init/mount.cpp @@ -236,6 +236,7 @@ void MagiskInit::setup_tmp(const char *path) { xmkdir(INTLROOT, 0711); xmkdir(DEVICEDIR, 0711); + xmkdir(WORKERDIR, 0); mount_preinit_dir(preinit_dev); @@ -251,6 +252,9 @@ void MagiskInit::setup_tmp(const char *path) { chdir(path); + // Prepare worker + xmount(WORKERDIR, WORKERDIR, nullptr, MS_BIND, nullptr); + // Use isolated devpts if kernel support if (access("/dev/pts/ptmx", F_OK) == 0) { xmkdirs(SHELLPTS, 0755);