From 695c8bc5d0a4b3d22938e3661f54b9abc8b1b396 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Tue, 17 Dec 2019 16:38:12 -0500 Subject: [PATCH] Detect package name for copying binaries Close #2152 --- native/jni/core/bootstages.cpp | 22 +++++++++++----------- native/jni/core/db.cpp | 27 ++++++++++++++++++++------- native/jni/include/db.h | 3 ++- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/native/jni/core/bootstages.cpp b/native/jni/core/bootstages.cpp index 6c1ba2175..c0424a2ea 100644 --- a/native/jni/core/bootstages.cpp +++ b/native/jni/core/bootstages.cpp @@ -317,13 +317,15 @@ static int bind_mount(const char *from, const char *to, bool log) { static bool magisk_env() { LOGI("* Initializing Magisk environment\n"); + string pkg; + check_manager(&pkg); + + char install_dir[128]; + sprintf(install_dir, "%s/0/%s/install", APP_DATA_DIR, pkg.data()); + // Alternative binaries paths - constexpr const char *alt_bin[] = { - "/cache/data_adb/magisk", "/data/magisk", - "/data/data/com.topjohnwu.magisk/install", - "/data/user_de/0/com.topjohnwu.magisk/install" - }; - for (auto &alt : alt_bin) { + const char *alt_bin[] = { "/cache/data_adb/magisk", "/data/magisk", install_dir }; + for (auto alt : alt_bin) { struct stat st; if (lstat(alt, &st) != -1) { if (S_ISLNK(st.st_mode)) { @@ -781,11 +783,9 @@ void boot_complete(int client) { rename(MANAGERAPK, "/data/magisk.apk"); install_apk("/data/magisk.apk"); } else { - // Check whether we have a valid manager installed - db_strings str; - get_db_strings(str, SU_MANAGER); - if (validate_manager(str[SU_MANAGER], 0, nullptr)) { - // There is no manager installed, install the stub + // Check whether we have manager installed + if (!check_manager()) { + // Install stub exec_command_sync("/sbin/magiskinit", "-x", "manager", "/data/magisk.apk"); install_apk("/data/magisk.apk"); } diff --git a/native/jni/core/db.cpp b/native/jni/core/db.cpp index c644e0b7e..910362d40 100644 --- a/native/jni/core/db.cpp +++ b/native/jni/core/db.cpp @@ -246,28 +246,41 @@ int get_uid_policy(su_access &su, int uid) { return 0; } -int validate_manager(string &alt_pkg, int userid, struct stat *st) { +bool check_manager(string *pkg) { + db_strings str; + get_db_strings(str, SU_MANAGER); + bool ret = validate_manager(str[SU_MANAGER], 0, nullptr); + if (pkg) { + if (ret) + pkg->swap(str[SU_MANAGER]); + else + *pkg = "xxx"; /* Make sure the return pkg can never exist */ + } + return ret; +} + +bool validate_manager(string &pkg, int userid, struct stat *st) { struct stat tmp_st; if (st == nullptr) st = &tmp_st; // Prefer DE storage char app_path[128]; - sprintf(app_path, "%s/%d/%s", APP_DATA_DIR, userid, alt_pkg.empty() ? "xxx" : alt_pkg.data()); - if (stat(app_path, st)) { + sprintf(app_path, "%s/%d/%s", APP_DATA_DIR, userid, pkg.data()); + if (pkg.empty() || stat(app_path, st)) { // Check the official package name sprintf(app_path, "%s/%d/" JAVA_PACKAGE_NAME, APP_DATA_DIR, userid); if (stat(app_path, st)) { LOGE("su: cannot find manager"); memset(st, 0, sizeof(*st)); - alt_pkg.clear(); - return 1; + pkg.clear(); + return false; } else { // Switch to official package if exists - alt_pkg = JAVA_PACKAGE_NAME; + pkg = JAVA_PACKAGE_NAME; } } - return 0; + return true; } void exec_sql(int client) { diff --git a/native/jni/include/db.h b/native/jni/include/db.h index 7b5726e0a..29614a249 100644 --- a/native/jni/include/db.h +++ b/native/jni/include/db.h @@ -155,7 +155,8 @@ typedef std::function db_row_cb; int get_db_settings(db_settings &cfg, int key = -1); int get_db_strings(db_strings &str, int key = -1); int get_uid_policy(su_access &su, int uid); -int validate_manager(std::string &alt_pkg, int userid, struct stat *st); +bool check_manager(std::string *pkg = nullptr); +bool validate_manager(std::string &pkg, int userid, struct stat *st); void exec_sql(int client); char *db_exec(const char *sql); char *db_exec(const char *sql, const db_row_cb &fn);