From 0b4baad78b0dc96298e52a30ba03e0b7655e5292 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 8 Jun 2017 22:56:21 +0800 Subject: [PATCH] Add mount namespace mode --- MagiskManager | 2 +- jni/magiskhide/hide_daemon.c | 10 ++-------- jni/su | 2 +- jni/utils/misc.c | 16 ++++++++++++++++ jni/utils/utils.h | 1 + 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/MagiskManager b/MagiskManager index bc576a965..d3ff482c9 160000 --- a/MagiskManager +++ b/MagiskManager @@ -1 +1 @@ -Subproject commit bc576a9659651703dc4cd4eaebaa9293381a2ac8 +Subproject commit d3ff482c9b46f58626fdcb6289ffa0cefbf2afcc diff --git a/jni/magiskhide/hide_daemon.c b/jni/magiskhide/hide_daemon.c index a1f593d70..b9a9c6323 100644 --- a/jni/magiskhide/hide_daemon.c +++ b/jni/magiskhide/hide_daemon.c @@ -56,7 +56,6 @@ int hide_daemon() { // When an error occurs, report its failure to main process err_handler = hide_daemon_err; - int fd; char buffer[4096], cache_block[256], *line; struct vector mount_list; @@ -73,13 +72,8 @@ int hide_daemon() { manage_selinux(); relink_sbin(); - snprintf(buffer, sizeof(buffer), "/proc/%d/ns/mnt", pid); - if(access(buffer, F_OK) == -1) continue; // Maybe process died.. - - fd = xopen(buffer, O_RDONLY); - // Switch to its namespace - xsetns(fd, 0); - close(fd); + if (switch_mnt_ns(pid)) + continue; snprintf(buffer, sizeof(buffer), "/proc/%d/mounts", pid); vec_init(&mount_list); diff --git a/jni/su b/jni/su index 38cc9dfec..1bbf96a0a 160000 --- a/jni/su +++ b/jni/su @@ -1 +1 @@ -Subproject commit 38cc9dfec88bca246725d79157657e43e9363425 +Subproject commit 1bbf96a0a7a942798df58883a376b8024d0fae7f diff --git a/jni/utils/misc.c b/jni/utils/misc.c index 034cdf6f1..1db66664c 100644 --- a/jni/utils/misc.c +++ b/jni/utils/misc.c @@ -1,6 +1,7 @@ /* misc.c - Store all functions that are unable to be catagorized clearly */ +#define _GNU_SOURCE #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -457,3 +459,17 @@ int resize_img(const char *img, int size) { snprintf(buffer, PATH_MAX, "e2fsck -yf %s; resize2fs %s %dM;", img, img, size); return system(buffer); } + +int switch_mnt_ns(int pid) { + char mnt[32]; + snprintf(mnt, sizeof(mnt), "/proc/%d/ns/mnt", pid); + if(access(mnt, R_OK) == -1) return 1; // Maybe process died.. + + int fd, ret; + fd = xopen(mnt, O_RDONLY); + if (fd < 0) return 1; + // Switch to its namespace + ret = setns(fd, 0); + close(fd); + return ret; +} diff --git a/jni/utils/utils.h b/jni/utils/utils.h index 10f72919f..efba1fcb0 100644 --- a/jni/utils/utils.h +++ b/jni/utils/utils.h @@ -94,5 +94,6 @@ void get_client_cred(int fd, struct ucred *cred); int create_img(const char *img, int size); int get_img_size(const char *img, int *used, int *total); int resize_img(const char *img, int size); +int switch_mnt_ns(int pid); #endif