Android Q init is not always a symlink

This commit is contained in:
topjohnwu 2019-03-03 14:56:36 -05:00
parent 14ae29d907
commit eaa9c7e2a0

View File

@ -256,6 +256,7 @@ static bool verify_precompiled() {
return memcmp(sys_sha, ven_sha, sizeof(sys_sha)) == 0; return memcmp(sys_sha, ven_sha, sizeof(sys_sha)) == 0;
} }
constexpr char SYSTEM_INIT[] = "/system/bin/init";
static bool patch_sepolicy() { static bool patch_sepolicy() {
bool init_patch = false; bool init_patch = false;
if (access(SPLIT_PRECOMPILE, R_OK) == 0 && verify_precompiled()) { if (access(SPLIT_PRECOMPILE, R_OK) == 0 && verify_precompiled()) {
@ -282,15 +283,10 @@ static bool patch_sepolicy() {
if (init_patch) { if (init_patch) {
// If init is symlink, copy it to rootfs so we can patch // If init is symlink, copy it to rootfs so we can patch
char real_init[128];
real_init[0] = '\0';
struct stat st; struct stat st;
lstat("/init", &st); lstat("/init", &st);
if (S_ISLNK(st.st_mode)) { if (S_ISLNK(st.st_mode))
xreadlink("/init", real_init, sizeof(real_init)); cp_afc(SYSTEM_INIT, "/init");
cp_afc(real_init, "/init");
}
size_t real_init_len = strlen(real_init);
char *addr; char *addr;
size_t size; size_t size;
@ -300,10 +296,10 @@ static bool patch_sepolicy() {
// Force init to load /sepolicy // Force init to load /sepolicy
memset(p, 'x', sizeof(SPLIT_PLAT_CIL) - 1); memset(p, 'x', sizeof(SPLIT_PLAT_CIL) - 1);
p += sizeof(SPLIT_PLAT_CIL) - 1; p += sizeof(SPLIT_PLAT_CIL) - 1;
} else if (real_init_len > 0 && memcmp(p, real_init, real_init_len + 1) == 0) { } else if (memcmp(p, SYSTEM_INIT, sizeof(SYSTEM_INIT)) == 0) {
// Force execute /init instead of real init // Force execute /init instead of /system/bin/init
strcpy(p, "/init"); strcpy(p, "/init");
p += real_init_len; p += sizeof(SYSTEM_INIT) - 1;
} }
} }
munmap(addr, size); munmap(addr, size);