diff --git a/jni/core/daemon.c b/jni/core/daemon.c index e69175004..2573332d1 100644 --- a/jni/core/daemon.c +++ b/jni/core/daemon.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,13 @@ void start_daemon() { xdup2(fd, STDERR_FILENO); close(fd); + // Block user signals + sigset_t block_set; + sigemptyset(&block_set); + sigaddset(&block_set, SIGUSR1); + sigaddset(&block_set, SIGUSR2); + pthread_sigmask(SIG_SETMASK, &block_set, NULL); + struct sockaddr_un sun; fd = setup_socket(&sun); diff --git a/jni/magiskhide/proc_monitor.c b/jni/magiskhide/proc_monitor.c index 1002f1ccb..92eaab4c3 100644 --- a/jni/magiskhide/proc_monitor.c +++ b/jni/magiskhide/proc_monitor.c @@ -149,6 +149,13 @@ exit: } void proc_monitor() { + // Unblock user signals + sigset_t block_set; + sigemptyset(&block_set); + sigaddset(&block_set, TERM_THREAD); + sigaddset(&block_set, HIDE_DONE); + pthread_sigmask(SIG_UNBLOCK, &block_set, NULL); + // Register the cancel signal struct sigaction act; memset(&act, 0, sizeof(act)); @@ -188,7 +195,12 @@ void proc_monitor() { xpipe2(pipefd, O_CLOEXEC); logcat_events[HIDE_EVENT] = pipefd[1]; - for (char *log, *line; xxread(pipefd[0], &log, sizeof(log)) > 0; free(log)) { + for (char *log, *line; 1; free(log)) { + if (read(pipefd[0], &log, sizeof(log)) != sizeof(log)) { + /* It might be interrupted */ + log = NULL; + continue; + } char *ss; if ((ss = strstr(log, "am_proc_start")) && (ss = strchr(ss, '['))) { int pid, ret, comma = 0;