From 7a376c9efc46fc41c3df94e185e703fa38713297 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 13 Sep 2017 15:45:07 +0800 Subject: [PATCH] Adjust the daemon for Pixel support --- jni/daemon/bootstages.c | 46 ++++++++++++++++++++++++++--------- jni/daemon/daemon.c | 3 +-- jni/magiskhide/proc_monitor.c | 22 ++++++++++++----- jni/utils/misc.c | 3 +-- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/jni/daemon/bootstages.c b/jni/daemon/bootstages.c index 03f5c4a65..c82bf1967 100644 --- a/jni/daemon/bootstages.c +++ b/jni/daemon/bootstages.c @@ -314,7 +314,11 @@ static void clone_skeleton(struct node_entry *node) { if (IS_LNK(child)) { // Copy symlinks directly cp_afc(buf2, buf); - LOGI("cplink: %s -> %s\n", buf2, buf); + #ifdef MAGISK_DEBUG + LOGD("cplink: %s -> %s\n",buf2, buf); + #else + LOGI("cplink: %s\n", buf); + #endif } else { snprintf(buf, PATH_MAX, "%s/%s", full_path, child->name); bind_mount(buf2, buf); @@ -394,12 +398,26 @@ static void mount_mirrors() { vec_init(&mounts); file_to_vector("/proc/mounts", &mounts); char *line; + int skip_initramfs = 0; + // Check whether skip_initramfs device vec_for_each(&mounts, line) { - if (strstr(line, " /system ")) { + if (strstr(line, " /system_root ")) { + xmkdir_p(MIRRDIR "/system", 0755); + bind_mount("/system_root/system", MIRRDIR "/system"); + skip_initramfs = 1; + break; + } + } + vec_for_each(&mounts, line) { + if (!skip_initramfs && strstr(line, " /system ")) { sscanf(line, "%s", buf); xmkdir_p(MIRRDIR "/system", 0755); xmount(buf, MIRRDIR "/system", "ext4", MS_RDONLY, NULL); - LOGI("mount: %s -> %s\n", buf, MIRRDIR "/system"); + #ifdef MAGISK_DEBUG + LOGD("mount: %s -> %s\n", buf, MIRRDIR "/system"); + #else + LOGI("mount: %s\n", MIRRDIR "/system"); + #endif continue; } if (strstr(line, " /vendor ")) { @@ -407,14 +425,22 @@ static void mount_mirrors() { sscanf(line, "%s", buf); xmkdir_p(MIRRDIR "/vendor", 0755); xmount(buf, MIRRDIR "/vendor", "ext4", MS_RDONLY, NULL); - LOGI("mount: %s -> %s\n", buf, MIRRDIR "/vendor"); + #ifdef MAGISK_DEBUG + LOGD("mount: %s -> %s\n", buf, MIRRDIR "/vendor"); + #else + LOGI("mount: %s\n", MIRRDIR "/vendor"); + #endif continue; } } vec_deep_destroy(&mounts); if (!seperate_vendor) { symlink(MIRRDIR "/system/vendor", MIRRDIR "/vendor"); - LOGI("link: %s -> %s\n", MIRRDIR "/system/vendor", MIRRDIR "/vendor"); + #ifdef MAGISK_DEBUG + LOGD("link: %s -> %s\n", MIRRDIR "/system/vendor", MIRRDIR "/vendor"); + #else + LOGI("link: %s\n", MIRRDIR "/vendor"); + #endif } mkdir_p(MIRRDIR "/bin", 0755); bind_mount(DATABIN, MIRRDIR "/bin"); @@ -503,9 +529,6 @@ void post_fs(int client) { // Error handler err_handler = unblock_boot_process; - // Start log monitor - monitor_logs(); - LOGI("** post-fs mode running\n"); // ack write_int(client, 0); @@ -536,6 +559,9 @@ void post_fs_data(int client) { if (!check_data()) goto unblock; + // Start log monitor + monitor_logs(); + #ifdef MAGISK_DEBUG // Start debug logs in new process debug_log_fd = xopen(DEBUG_LOG, O_WRONLY | O_CREAT | O_CLOEXEC | O_TRUNC, 0644); @@ -569,10 +595,6 @@ void post_fs_data(int client) { link_busybox(); // Merge images - if (merge_img("/cache/magisk.img", MAINIMG)) { - LOGE("Image merge %s -> %s failed!\n", "/cache/magisk.img", MAINIMG); - goto unblock; - } if (merge_img("/data/magisk_merge.img", MAINIMG)) { LOGE("Image merge %s -> %s failed!\n", "/data/magisk_merge.img", MAINIMG); goto unblock; diff --git a/jni/daemon/daemon.c b/jni/daemon/daemon.c index 531fbbaee..c08a8bd2b 100644 --- a/jni/daemon/daemon.c +++ b/jni/daemon/daemon.c @@ -134,7 +134,7 @@ void start_daemon(int client) { close(client); xsetsid(); setcon("u:r:su:s0"); - umask(022); + umask(0); int fd = xopen("/dev/null", O_RDWR | O_CLOEXEC); xdup2(fd, STDIN_FILENO); xdup2(fd, STDOUT_FILENO); @@ -171,7 +171,6 @@ void start_daemon(int client) { create_links(NULL, "/sbin"); xchmod("/sbin", 0755); xmkdir("/magisk", 0755); - xchmod("/magisk", 0755); xmount(NULL, "/", NULL, MS_REMOUNT | MS_RDONLY, NULL); // Loop forever to listen for requests diff --git a/jni/magiskhide/proc_monitor.c b/jni/magiskhide/proc_monitor.c index ea335c664..047fa9525 100644 --- a/jni/magiskhide/proc_monitor.c +++ b/jni/magiskhide/proc_monitor.c @@ -21,7 +21,7 @@ static int zygote_num; static char init_ns[32], zygote_ns[2][32], cache_block[256]; -static int log_pid, log_fd, target_pid; +static int log_pid, log_fd, target_pid, has_cache = 1; static char *buffer; // Workaround for the lack of pthread_cancel @@ -101,20 +101,30 @@ static void hide_daemon(int pid) { file_to_vector(buffer, &mount_list); // Find the cache block name if not found yet - if (cache_block[0] == '\0') { + if (has_cache && cache_block[0] == '\0') { vec_for_each(&mount_list, line) { if (strstr(line, " /cache ")) { sscanf(line, "%256s", cache_block); break; } } + if (strlen(cache_block) == 0) + has_cache = 0; } - // First unmount dummy skeletons, /sbin links, cache mounts, and mirrors + // Unmout cache mounts + if (has_cache) { + vec_for_each(&mount_list, line) { + if (strstr(line, cache_block) && (strstr(line, " /system/") || strstr(line, " /vendor/"))) { + sscanf(line, "%*s %4096s", buffer); + lazy_unmount(buffer); + } + } + } + + // Unmount dummy skeletons, /sbin links, and mirrors vec_for_each(&mount_list, line) { - if (strstr(line, "tmpfs /system") || strstr(line, "tmpfs /vendor") || strstr(line, "tmpfs /sbin") - || (strstr(line, cache_block) && (strstr(line, " /system") || strstr(line, " /vendor"))) - || strstr(line, MIRRDIR)) { + if (strstr(line, "tmpfs /system") || strstr(line, "tmpfs /vendor") || strstr(line, "tmpfs /sbin") || strstr(line, MIRRDIR)) { sscanf(line, "%*s %4096s", buffer); lazy_unmount(buffer); } diff --git a/jni/utils/misc.c b/jni/utils/misc.c index 22ff80138..653370f5b 100644 --- a/jni/utils/misc.c +++ b/jni/utils/misc.c @@ -196,8 +196,7 @@ void unlock_blocks() { while((entry = readdir(dir))) { if (entry->d_type == DT_BLK && strstr(entry->d_name, "ram") == NULL && - strstr(entry->d_name, "loop") == NULL && - strstr(entry->d_name, "dm-0") == NULL) { + strstr(entry->d_name, "loop") == NULL) { snprintf(path, sizeof(path), "%s/%s", DEV_BLOCK, entry->d_name); if ((fd = xopen(path, O_RDONLY)) < 0) continue;