parent
06c42d05c3
commit
695c8bc5d0
@ -317,13 +317,15 @@ static int bind_mount(const char *from, const char *to, bool log) {
|
|||||||
static bool magisk_env() {
|
static bool magisk_env() {
|
||||||
LOGI("* Initializing Magisk environment\n");
|
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
|
// Alternative binaries paths
|
||||||
constexpr const char *alt_bin[] = {
|
const char *alt_bin[] = { "/cache/data_adb/magisk", "/data/magisk", install_dir };
|
||||||
"/cache/data_adb/magisk", "/data/magisk",
|
for (auto alt : alt_bin) {
|
||||||
"/data/data/com.topjohnwu.magisk/install",
|
|
||||||
"/data/user_de/0/com.topjohnwu.magisk/install"
|
|
||||||
};
|
|
||||||
for (auto &alt : alt_bin) {
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (lstat(alt, &st) != -1) {
|
if (lstat(alt, &st) != -1) {
|
||||||
if (S_ISLNK(st.st_mode)) {
|
if (S_ISLNK(st.st_mode)) {
|
||||||
@ -781,11 +783,9 @@ void boot_complete(int client) {
|
|||||||
rename(MANAGERAPK, "/data/magisk.apk");
|
rename(MANAGERAPK, "/data/magisk.apk");
|
||||||
install_apk("/data/magisk.apk");
|
install_apk("/data/magisk.apk");
|
||||||
} else {
|
} else {
|
||||||
// Check whether we have a valid manager installed
|
// Check whether we have manager installed
|
||||||
db_strings str;
|
if (!check_manager()) {
|
||||||
get_db_strings(str, SU_MANAGER);
|
// Install stub
|
||||||
if (validate_manager(str[SU_MANAGER], 0, nullptr)) {
|
|
||||||
// There is no manager installed, install the stub
|
|
||||||
exec_command_sync("/sbin/magiskinit", "-x", "manager", "/data/magisk.apk");
|
exec_command_sync("/sbin/magiskinit", "-x", "manager", "/data/magisk.apk");
|
||||||
install_apk("/data/magisk.apk");
|
install_apk("/data/magisk.apk");
|
||||||
}
|
}
|
||||||
|
@ -246,28 +246,41 @@ int get_uid_policy(su_access &su, int uid) {
|
|||||||
return 0;
|
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;
|
struct stat tmp_st;
|
||||||
if (st == nullptr)
|
if (st == nullptr)
|
||||||
st = &tmp_st;
|
st = &tmp_st;
|
||||||
|
|
||||||
// Prefer DE storage
|
// Prefer DE storage
|
||||||
char app_path[128];
|
char app_path[128];
|
||||||
sprintf(app_path, "%s/%d/%s", APP_DATA_DIR, userid, alt_pkg.empty() ? "xxx" : alt_pkg.data());
|
sprintf(app_path, "%s/%d/%s", APP_DATA_DIR, userid, pkg.data());
|
||||||
if (stat(app_path, st)) {
|
if (pkg.empty() || stat(app_path, st)) {
|
||||||
// Check the official package name
|
// Check the official package name
|
||||||
sprintf(app_path, "%s/%d/" JAVA_PACKAGE_NAME, APP_DATA_DIR, userid);
|
sprintf(app_path, "%s/%d/" JAVA_PACKAGE_NAME, APP_DATA_DIR, userid);
|
||||||
if (stat(app_path, st)) {
|
if (stat(app_path, st)) {
|
||||||
LOGE("su: cannot find manager");
|
LOGE("su: cannot find manager");
|
||||||
memset(st, 0, sizeof(*st));
|
memset(st, 0, sizeof(*st));
|
||||||
alt_pkg.clear();
|
pkg.clear();
|
||||||
return 1;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
// Switch to official package if exists
|
// Switch to official package if exists
|
||||||
alt_pkg = JAVA_PACKAGE_NAME;
|
pkg = JAVA_PACKAGE_NAME;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void exec_sql(int client) {
|
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_settings(db_settings &cfg, int key = -1);
|
||||||
int get_db_strings(db_strings &str, int key = -1);
|
int get_db_strings(db_strings &str, int key = -1);
|
||||||
int get_uid_policy(su_access &su, int uid);
|
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);
|
void exec_sql(int client);
|
||||||
char *db_exec(const char *sql);
|
char *db_exec(const char *sql);
|
||||||
char *db_exec(const char *sql, const db_row_cb &fn);
|
char *db_exec(const char *sql, const db_row_cb &fn);
|
||||||
|
Loading…
Reference in New Issue
Block a user