parent
06c42d05c3
commit
695c8bc5d0
@ -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");
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -155,7 +155,8 @@ typedef std::function<bool(db_row&)> 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);
|
||||
|
Loading…
Reference in New Issue
Block a user