From ec8475bca59f03e8c11770b30cac090d4ca96829 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Sat, 25 Feb 2023 13:53:28 +0800 Subject: [PATCH] Better unmount refine --- loader/src/injector/misc.cpp | 5 ++--- loader/src/injector/misc.hpp | 2 +- loader/src/injector/unmount.cpp | 19 ++++++++++++++----- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/loader/src/injector/misc.cpp b/loader/src/injector/misc.cpp index dee9f9e..0731a65 100644 --- a/loader/src/injector/misc.cpp +++ b/loader/src/injector/misc.cpp @@ -23,14 +23,13 @@ int parse_int(std::string_view s) { return val; } -void parse_mnt(const char* file, const std::function& fn) { +void parse_mnt(const char* file, const std::function& fn) { auto fp = sFILE(setmntent(file, "re"), endmntent); if (fp) { mntent mentry{}; char buf[PATH_MAX]; while (getmntent_r(fp.get(), &mentry, buf, sizeof(buf))) { - if (!fn(&mentry)) - break; + fn(&mentry); } } } diff --git a/loader/src/injector/misc.hpp b/loader/src/injector/misc.hpp index 083414a..fda3db3 100644 --- a/loader/src/injector/misc.hpp +++ b/loader/src/injector/misc.hpp @@ -126,7 +126,7 @@ struct StringCmp { */ int parse_int(std::string_view s); -void parse_mnt(const char* file, const std::function& fn); +void parse_mnt(const char* file, const std::function& fn); std::list split_str(std::string_view s, std::string_view delimiter); diff --git a/loader/src/injector/unmount.cpp b/loader/src/injector/unmount.cpp index 6e98a48..594aca7 100644 --- a/loader/src/injector/unmount.cpp +++ b/loader/src/injector/unmount.cpp @@ -13,7 +13,7 @@ namespace { if (umount2(mountpoint, MNT_DETACH) != -1) { LOGD("Unmounted (%s)", mountpoint); } else { - LOGW("Failed to unmount: %s (%s)", strerror(errno), mountpoint); + PLOGE("Unmount (%s)", mountpoint); } } } @@ -29,11 +29,18 @@ void revert_unmount() { std::vector targets; std::list> backups; + // Unmount ksu module dir last targets.emplace_back(KSU_MODULE_DIR); parse_mnt("/proc/self/mounts", [&](mntent* mentry) { if (mentry->mnt_dir == KSU_MODULE_DIR) { ksu_loop = mentry->mnt_fsname; + return; } + // Unmount everything on /data/adb except ksu module dir + if (str_starts(mentry->mnt_dir, "/data/adb")) { + targets.emplace_back(mentry->mnt_dir); + } + // Unmount ksu overlays if (mentry->mnt_type == "overlay"sv) { if (str_contains(mentry->mnt_opts, KSU_MODULE_DIR)) { targets.emplace_back(mentry->mnt_dir); @@ -41,19 +48,20 @@ void revert_unmount() { backups.emplace_back(mentry->mnt_dir, mentry->mnt_opts); } } - return true; }); + // Unmount everything from ksu loop except ksu module dir parse_mnt("/proc/self/mounts", [&](mntent* mentry) { - if (mentry->mnt_fsname == ksu_loop) { + if (mentry->mnt_fsname == ksu_loop && mentry->mnt_dir != KSU_MODULE_DIR) { targets.emplace_back(mentry->mnt_dir); } - return true; }); + // Do unmount for (auto& s: reversed(targets)) { lazy_unmount(s.data()); } + // Affirm unmounted system overlays parse_mnt("/proc/self/mounts", [&](mntent* mentry) { if (mentry->mnt_type == "overlay"sv) { backups.remove_if([&](auto& mnt) { @@ -63,6 +71,7 @@ void revert_unmount() { return true; }); + // Restore system overlays for (auto& mnt: backups) { auto opts = split_str(mnt.second, ","); unsigned long flags = 0; @@ -76,7 +85,7 @@ void revert_unmount() { if (mount("overlay", mnt.first.data(), "overlay", flags, mnt_data.data()) != -1) { LOGD("Remounted (%s)", mnt.first.data()); } else { - LOGW("Failed to remount: %s (%s, %s)", strerror(errno), mnt.first.data(), mnt_data.data()); + PLOGE("Remount (%s, %s)", mnt.first.data(), mnt_data.data()); } } }