mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-06-12 21:27:41 +02:00
More complete support for fstab in dt
This commit is contained in:
@ -81,19 +81,28 @@ static void load_overlay_rc(const char *overlay) {
|
||||
}
|
||||
}
|
||||
|
||||
int raw_data_patch(void *addr, size_t sz, str_pairs list) {
|
||||
int count = 0;
|
||||
for (uint8_t *p = (uint8_t *)addr, *eof = (uint8_t *)addr + sz; p < eof; ++p) {
|
||||
for (auto &[from, to] : list) {
|
||||
if (memcmp(p, from.data(), from.length() + 1) == 0) {
|
||||
LOGD("Replace [%s] -> [%s]\n", from.data(), to.data());
|
||||
memset(p, 0, from.length());
|
||||
memcpy(p, to.data(), to.length());
|
||||
++count;
|
||||
p += from.length();
|
||||
}
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void RootFSInit::setup_rootfs() {
|
||||
if (patch_sepolicy("/sepolicy")) {
|
||||
char *addr;
|
||||
size_t size;
|
||||
mmap_rw("/init", addr, size);
|
||||
for (char *p = addr; p < addr + size; ++p) {
|
||||
if (memcmp(p, SPLIT_PLAT_CIL, sizeof(SPLIT_PLAT_CIL)) == 0) {
|
||||
// Force init to load /sepolicy
|
||||
LOGD("Remove from init: " SPLIT_PLAT_CIL "\n");
|
||||
memset(p, 'x', sizeof(SPLIT_PLAT_CIL) - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
raw_data_patch(addr, size, {make_pair(SPLIT_PLAT_CIL, "xxx")});
|
||||
munmap(addr, size);
|
||||
}
|
||||
|
||||
@ -259,43 +268,26 @@ void SARBase::patch_rootdir() {
|
||||
|
||||
// Patch init
|
||||
raw_data init;
|
||||
bool redirect = false;
|
||||
int src = xopen("/init", O_RDONLY | O_CLOEXEC);
|
||||
fd_full_read(src, init.buf, init.sz);
|
||||
for (uint8_t *p = init.buf, *eof = init.buf + init.sz; p < eof;) {
|
||||
if (memcmp(p, SPLIT_PLAT_CIL, sizeof(SPLIT_PLAT_CIL)) == 0) {
|
||||
LOGD("Remove from init: " SPLIT_PLAT_CIL "\n");
|
||||
memset(p, 'x', sizeof(SPLIT_PLAT_CIL) - 1);
|
||||
p += sizeof(SPLIT_PLAT_CIL);
|
||||
} else if (memcmp(p, MONOPOLICY, sizeof(MONOPOLICY)) == 0) {
|
||||
LOGD("Patch init [" MONOPOLICY "] -> [%s]\n", sepol);
|
||||
strcpy(reinterpret_cast<char *>(p), sepol);
|
||||
redirect = true;
|
||||
p += sizeof(MONOPOLICY);
|
||||
} else {
|
||||
++p;
|
||||
}
|
||||
}
|
||||
int patch_count = raw_data_patch(init.buf, init.sz, {
|
||||
make_pair(SPLIT_PLAT_CIL, "xxx"), /* Force loading monolithic sepolicy */
|
||||
make_pair(MONOPOLICY, sepol) /* Redirect /sepolicy to custom path */
|
||||
});
|
||||
xmkdir(ROOTOVL, 0);
|
||||
int dest = xopen(ROOTOVL "/init", O_CREAT | O_WRONLY | O_CLOEXEC);
|
||||
int dest = xopen(ROOTOVL "/init", O_CREAT | O_WRONLY | O_CLOEXEC, 0);
|
||||
xwrite(dest, init.buf, init.sz);
|
||||
fclone_attr(src, dest);
|
||||
close(src);
|
||||
close(dest);
|
||||
|
||||
if (!redirect) {
|
||||
if (patch_count != 2 && access(LIBSELINUX, F_OK) == 0) {
|
||||
// init is dynamically linked, need to patch libselinux
|
||||
raw_data lib;
|
||||
full_read(LIBSELINUX, lib.buf, lib.sz);
|
||||
for (uint8_t *p = lib.buf, *eof = lib.buf + lib.sz; p < eof; ++p) {
|
||||
if (memcmp(p, MONOPOLICY, sizeof(MONOPOLICY)) == 0) {
|
||||
LOGD("Patch libselinux.so [" MONOPOLICY "] -> [%s]\n", sepol);
|
||||
strcpy(reinterpret_cast<char *>(p), sepol);
|
||||
break;
|
||||
}
|
||||
}
|
||||
raw_data_patch(lib.buf, lib.sz, {make_pair(MONOPOLICY, sepol)});
|
||||
xmkdirs(dirname(ROOTOVL LIBSELINUX), 0755);
|
||||
dest = xopen(ROOTOVL LIBSELINUX, O_CREAT | O_WRONLY | O_CLOEXEC);
|
||||
dest = xopen(ROOTOVL LIBSELINUX, O_CREAT | O_WRONLY | O_CLOEXEC, 0);
|
||||
xwrite(dest, lib.buf, lib.sz);
|
||||
close(dest);
|
||||
clone_attr(LIBSELINUX, ROOTOVL LIBSELINUX);
|
||||
|
Reference in New Issue
Block a user