From 736729f5ef646549c8d098b3a8fabf1953d461c8 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 16 Jul 2019 23:54:52 -0700 Subject: [PATCH] Maintain a list of pre-init mounts Keep track of everything to unmount --- native/jni/core/daemon.cpp | 10 ++++++---- native/jni/include/magisk.h | 2 ++ native/jni/init/rootdir.cpp | 8 +++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/native/jni/core/daemon.cpp b/native/jni/core/daemon.cpp index 0c1243eac..0a72d82ef 100644 --- a/native/jni/core/daemon.cpp +++ b/native/jni/core/daemon.cpp @@ -109,10 +109,12 @@ static void main_daemon() { restore_rootcon(); // Unmount pre-init patches - umount2("/init", MNT_DETACH); - umount2("/init.rc", MNT_DETACH); - umount2("/system/lib/libselinux.so", MNT_DETACH); - umount2("/system/lib64/libselinux.so", MNT_DETACH); + if (access(ROOTMNT, F_OK) == 0) { + file_readline(ROOTMNT, [](auto line) -> bool { + umount2(line.data(), MNT_DETACH); + return true; + }, true); + } int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC); xdup2(fd, STDOUT_FILENO); diff --git a/native/jni/include/magisk.h b/native/jni/include/magisk.h index 4ea5557ce..a6509ede6 100644 --- a/native/jni/include/magisk.h +++ b/native/jni/include/magisk.h @@ -12,6 +12,8 @@ #define BLOCKDIR MAGISKTMP "/block" #define BBPATH MAGISKTMP "/busybox" #define MODULEMNT MAGISKTMP "/modules" +#define ROOTOVL MAGISKTMP "/rootdir" +#define ROOTMNT ROOTOVL "/.mount_list" #define SECURE_DIR "/data/adb" #define MODULEROOT SECURE_DIR "/modules" #define MODULEUPGRADE SECURE_DIR "/modules_update" diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index 288f396cc..001bfe077 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -225,13 +225,14 @@ static void sbin_overlay(const raw_data &self, const raw_data &config) { xsymlink("./magiskinit", "/sbin/supolicy"); } -#define ROOTOVL MAGISKTMP "/rootdir" #define ROOTMIR MIRRDIR "/system_root" #define ROOTBLK BLOCKDIR "/system_root" #define MONOPOLICY "/sepolicy" #define PATCHPOLICY "/sbin/.se" #define LIBSELINUX "/system/" LIBNAME "/libselinux.so" +static string mount_list; + static void magic_mount(int dirfd, const string &path) { DIR *dir = xfdopendir(dirfd); for (dirent *entry; (entry = readdir(dir));) { @@ -248,6 +249,8 @@ static void magic_mount(int dirfd, const string &path) { string src = ROOTOVL + dest; LOGD("Mount [%s] -> [%s]\n", src.data(), dest.data()); xmount(src.data(), dest.data(), nullptr, MS_BIND, nullptr); + mount_list += dest; + mount_list += '\n'; } } } @@ -376,6 +379,9 @@ void SARCommon::patch_rootdir() { src = xopen(ROOTOVL, O_RDONLY | O_CLOEXEC); magic_mount(src, ""); close(src); + dest = xopen(ROOTMNT, O_WRONLY | O_CREAT | O_CLOEXEC); + write(dest, mount_list.data(), mount_list.length()); + close(dest); } #define FSR "/first_stage_ramdisk"