Adjustments for unified binary

This commit is contained in:
topjohnwu 2017-04-05 06:06:21 +08:00
parent e103676b65
commit 3800b4b45c
6 changed files with 54 additions and 144615 deletions

View File

@ -2,10 +2,11 @@ LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := su
LOCAL_STATIC_LIBRARIES := libselinux
LOCAL_C_INCLUDES := jni/selinux/libselinux/include/ jni/selinux/libsepol/include/ jni/su/sqlite3/
LOCAL_SRC_FILES := su.c daemon.c activity.c db.c utils.c pts.c sqlite3/sqlite3.c
LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION -std=gnu11
LOCAL_STATIC_LIBRARIES := libselinux libsqlite3
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
LOCAL_CFLAGS := -DSQLITE_OMIT_LOAD_EXTENSION -DINDEP_BINARY
include $(BUILD_EXECUTABLE)
include jni/selinux/libselinux/Android.mk
include jni/sqlite3/Android.mk

34
indep_bin.h Normal file
View File

@ -0,0 +1,34 @@
/* 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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

18
su.c
View File

@ -45,6 +45,12 @@
#include "su.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 daemon_from_uid;
extern int daemon_from_pid;
@ -595,16 +601,12 @@ static char *concat_commands(int argc, char *argv[]) {
return strdup(command);
}
int main(int argc, char *argv[]) {
int su_main(int argc, char *argv[]) {
if (argc == 2 && strcmp(argv[1], "--daemon") == 0) {
//Everything we'll exec will be in su, not su_daemon
setexeccon("u:r:su:s0");
return run_daemon();
}
return su_main(argc, argv);
}
int su_main(int argc, char *argv[]) {
int ppid = getppid();
if ((geteuid() != AID_ROOT && getuid() != AID_ROOT) ||
(get_api_version() >= 18 && getuid() == AID_SHELL) ||
@ -863,7 +865,7 @@ int su_main_nodaemon(int argc, char **argv) {
mkdir(REQUESTOR_CACHE_PATH, 0770);
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);
}
@ -872,11 +874,11 @@ int su_main_nodaemon(int argc, char **argv) {
deny(&ctx);
}
if (setegid(st.st_gid)) {
PLOGE("setegid (%lu)", st.st_gid);
PLOGE("setegid (%u)", st.st_gid);
deny(&ctx);
}
if (seteuid(st.st_uid)) {
PLOGE("seteuid (%lu)", st.st_uid);
PLOGE("seteuid (%u)", st.st_uid);
deny(&ctx);
}

34
su.h
View File

@ -18,10 +18,12 @@
#ifndef SU_h
#define SU_h 1
#ifdef LOG_TAG
#undef LOG_TAG
#ifdef INDEP_BINARY
#include "indep_bin.h"
#else
#include "magisk.h"
#endif
#define LOG_TAG "su"
#ifndef AID_SHELL
#define AID_SHELL (get_shell_uid())
@ -178,30 +180,4 @@ int su_main_nodaemon(int argc, char *argv[]);
// deadbeat dad fork.
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