Commit 3800b4b4 authored by topjohnwu's avatar topjohnwu

Adjustments for unified binary

parent e103676b
...@@ -2,10 +2,11 @@ LOCAL_PATH := $(call my-dir) ...@@ -2,10 +2,11 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := su LOCAL_MODULE := su
LOCAL_STATIC_LIBRARIES := libselinux LOCAL_STATIC_LIBRARIES := libselinux libsqlite3
LOCAL_C_INCLUDES := jni/selinux/libselinux/include/ jni/selinux/libsepol/include/ jni/su/sqlite3/ LOCAL_C_INCLUDES := jni/selinux/libselinux/include/ jni/selinux/libsepol/include/ jni/sqlite3/
LOCAL_SRC_FILES := su.c daemon.c activity.c db.c utils.c pts.c sqlite3/sqlite3.c LOCAL_SRC_FILES := su.c daemon.c activity.c db.c utils.c pts.c
LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION -std=gnu11 LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION -DINDEP_BINARY
include $(BUILD_EXECUTABLE) include $(BUILD_EXECUTABLE)
include jni/selinux/libselinux/Android.mk include jni/selinux/libselinux/Android.mk
include jni/sqlite3/Android.mk
/* This file is here because is uses some same macros in magisk.h
* So we have to remove them from su.h.
* However, if we want to build our own binary, we still have to define them
*/
#ifndef _INDEP_BIN_H_
#define _INDEP_BIN_H_
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "su"
// fallback to using /system/bin/log.
// can't use liblog.so because this is a static binary.
#ifndef LOGE
#define LOGE exec_loge
#endif
#ifndef LOGD
#define LOGD exec_logd
#endif
#ifndef LOGW
#define LOGW exec_logw
#endif
#include <errno.h>
#include <string.h>
#define PLOGE(fmt,args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
#define PLOGEV(fmt,err,args...) LOGE(fmt " failed with %d: %s", ##args, err, strerror(err))
int su_main(int argc, char *argv[]);
#endif
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -45,6 +45,12 @@ ...@@ -45,6 +45,12 @@
#include "su.h" #include "su.h"
#include "utils.h" #include "utils.h"
#ifdef INDEP_BINARY
int main(int argc, char *argv[]) {
return su_main(argc, argv);
}
#endif
extern int is_daemon; extern int is_daemon;
extern int daemon_from_uid; extern int daemon_from_uid;
extern int daemon_from_pid; extern int daemon_from_pid;
...@@ -595,16 +601,12 @@ static char *concat_commands(int argc, char *argv[]) { ...@@ -595,16 +601,12 @@ static char *concat_commands(int argc, char *argv[]) {
return strdup(command); return strdup(command);
} }
int main(int argc, char *argv[]) { int su_main(int argc, char *argv[]) {
if (argc == 2 && strcmp(argv[1], "--daemon") == 0) { if (argc == 2 && strcmp(argv[1], "--daemon") == 0) {
//Everything we'll exec will be in su, not su_daemon //Everything we'll exec will be in su, not su_daemon
setexeccon("u:r:su:s0"); setexeccon("u:r:su:s0");
return run_daemon(); return run_daemon();
} }
return su_main(argc, argv);
}
int su_main(int argc, char *argv[]) {
int ppid = getppid(); int ppid = getppid();
if ((geteuid() != AID_ROOT && getuid() != AID_ROOT) || if ((geteuid() != AID_ROOT && getuid() != AID_ROOT) ||
(get_api_version() >= 18 && getuid() == AID_SHELL) || (get_api_version() >= 18 && getuid() == AID_SHELL) ||
...@@ -863,7 +865,7 @@ int su_main_nodaemon(int argc, char **argv) { ...@@ -863,7 +865,7 @@ int su_main_nodaemon(int argc, char **argv) {
mkdir(REQUESTOR_CACHE_PATH, 0770); mkdir(REQUESTOR_CACHE_PATH, 0770);
if (chown(REQUESTOR_CACHE_PATH, st.st_uid, st.st_gid)) { if (chown(REQUESTOR_CACHE_PATH, st.st_uid, st.st_gid)) {
PLOGE("chown (%s, %ld, %ld)", REQUESTOR_CACHE_PATH, st.st_uid, st.st_gid); PLOGE("chown (%s, %u, %u)", REQUESTOR_CACHE_PATH, st.st_uid, st.st_gid);
deny(&ctx); deny(&ctx);
} }
...@@ -872,11 +874,11 @@ int su_main_nodaemon(int argc, char **argv) { ...@@ -872,11 +874,11 @@ int su_main_nodaemon(int argc, char **argv) {
deny(&ctx); deny(&ctx);
} }
if (setegid(st.st_gid)) { if (setegid(st.st_gid)) {
PLOGE("setegid (%lu)", st.st_gid); PLOGE("setegid (%u)", st.st_gid);
deny(&ctx); deny(&ctx);
} }
if (seteuid(st.st_uid)) { if (seteuid(st.st_uid)) {
PLOGE("seteuid (%lu)", st.st_uid); PLOGE("seteuid (%u)", st.st_uid);
deny(&ctx); deny(&ctx);
} }
......
...@@ -18,10 +18,12 @@ ...@@ -18,10 +18,12 @@
#ifndef SU_h #ifndef SU_h
#define SU_h 1 #define SU_h 1
#ifdef LOG_TAG #ifdef INDEP_BINARY
#undef LOG_TAG #include "indep_bin.h"
#else
#include "magisk.h"
#endif #endif
#define LOG_TAG "su"
#ifndef AID_SHELL #ifndef AID_SHELL
#define AID_SHELL (get_shell_uid()) #define AID_SHELL (get_shell_uid())
...@@ -178,30 +180,4 @@ int su_main_nodaemon(int argc, char *argv[]); ...@@ -178,30 +180,4 @@ int su_main_nodaemon(int argc, char *argv[]);
// deadbeat dad fork. // deadbeat dad fork.
int fork_zero_fucks(); int fork_zero_fucks();
// fallback to using /system/bin/log.
// can't use liblog.so because this is a static binary.
#ifndef LOGE
#define LOGE exec_loge
#endif
#ifndef LOGD
#define LOGD exec_logd
#endif
#ifndef LOGW
#define LOGW exec_logw
#endif
#if 0
#undef LOGE
#define LOGE(fmt,args...) fprintf(stderr, fmt, ##args)
#undef LOGD
#define LOGD(fmt,args...) fprintf(stderr, fmt, ##args)
#undef LOGW
#define LOGW(fmt,args...) fprintf(stderr, fmt, ##args)
#endif
#include <errno.h>
#include <string.h>
#define PLOGE(fmt,args...) LOGE(fmt " failed with %d: %s", ##args, errno, strerror(errno))
#define PLOGEV(fmt,err,args...) LOGE(fmt " failed with %d: %s", ##args, err, strerror(err))
#endif #endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment