diff --git a/activity.c b/activity.c index aba453579..4af414122 100644 --- a/activity.c +++ b/activity.c @@ -24,6 +24,14 @@ #define AM_PATH "/system/bin/app_process", "/system/bin", "com.android.commands.am.Am" +static char *get_command(const struct su_request *to) { + if (to->command) + return to->command; + if (to->shell) + return to->shell; + return DEFAULT_SHELL; +} + static void silent_run(char* const args[]) { set_identity(0); if (fork()) diff --git a/misc.c b/misc.c deleted file mode 100644 index d980bbcf0..000000000 --- a/misc.c +++ /dev/null @@ -1,51 +0,0 @@ -/* misc.c - Miscellaneous stuffs for su - */ - -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include - -#include "magisk.h" -#include "su.h" - -void set_identity(unsigned uid) { - /* - * Set effective uid back to root, otherwise setres[ug]id will fail - * if uid isn't root. - */ - if (seteuid(0)) { - PLOGE("seteuid (root)"); - } - if (setresgid(uid, uid, uid)) { - PLOGE("setresgid (%u)", uid); - } - if (setresuid(uid, uid, uid)) { - PLOGE("setresuid (%u)", uid); - } -} - -char *get_command(const struct su_request *to) { - if (to->command) - return to->command; - if (to->shell) - return to->shell; - return DEFAULT_SHELL; -} - -int fork_zero_fucks() { - int pid = fork(); - if (pid) { - int status; - waitpid(pid, &status, 0); - return pid; - } else { - if (fork() != 0) - exit(0); - return 0; - } -} diff --git a/su.c b/su.c index 2f62f9d41..44dd8fc42 100644 --- a/su.c +++ b/su.c @@ -86,6 +86,22 @@ static void populate_environment(const struct su_context *ctx) { } } +void set_identity(unsigned uid) { + /* + * Set effective uid back to root, otherwise setres[ug]id will fail + * if uid isn't root. + */ + if (seteuid(0)) { + PLOGE("seteuid (root)"); + } + if (setresgid(uid, uid, uid)) { + PLOGE("setresgid (%u)", uid); + } + if (setresuid(uid, uid, uid)) { + PLOGE("setresuid (%u)", uid); + } +} + static __attribute__ ((noreturn)) void allow() { char *arg0; @@ -114,7 +130,7 @@ static __attribute__ ((noreturn)) void allow() { set_identity(su_ctx->to.uid); setexeccon("u:r:su:s0"); - + su_ctx->to.argv[--su_ctx->to.argc] = arg0; execvp(binary, su_ctx->to.argv + su_ctx->to.argc); fprintf(stderr, "Cannot execute %s: %s\n", binary, strerror(errno)); diff --git a/su.h b/su.h index d9c00596c..8f3edb268 100644 --- a/su.h +++ b/su.h @@ -119,6 +119,7 @@ extern int pipefd[2]; int su_daemon_main(int argc, char **argv); __attribute__ ((noreturn)) void exit2(int status); +void set_identity(unsigned uid); // su_client.c @@ -136,10 +137,4 @@ void app_send_request(struct su_context *ctx); void database_check(struct su_context *ctx); -// misc.c - -void set_identity(unsigned uid); -char *get_command(const struct su_request *to); -int fork_zero_fucks(); - #endif