Support custom legacy Sony devices with init.real setup

Custom ROM bring-ups of legacy Sony devices contain the following:
/init (symlink to /bin/init_sony)
/init.real (the "real" Android init)
/bin/init_sony (this was /sbin/init_sony on Android <11)

Kernel loads the ramdisk and starts /init -> /bin/init_sony
/bin/init_sony does low-level device setup (see: https://github.com/LineageOS/android_device_sony_common/blob/lineage-18.1/init/init_main.cpp)
/bin/init_sony unlinks /init and renames /init.real to /init
/bin/init_sony starts /init

Since init_sony needs to run first magiskinit needs to replace init.real instead, so add workarounds based on detection of init.real to boot patcher and uninstaller

Thanks @115ek and @bleckdeth

Fixes #3636

Co-authored-by: topjohnwu <topjohnwu@gmail.com>
This commit is contained in:
Chris Renshaw 2021-10-30 22:59:20 -03:00 committed by GitHub
parent 2c44e1bb93
commit 6663fd3526
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 41 additions and 12 deletions

View File

@ -252,6 +252,12 @@ bool check_two_stage() {
if (access("/system/bin/init", F_OK) == 0) if (access("/system/bin/init", F_OK) == 0)
return true; return true;
// If we still have no indication, parse the original init and see what's up // If we still have no indication, parse the original init and see what's up
auto init = mmap_data::ro("/.backup/init"); auto init = mmap_data::ro(backup_init());
return init.contains("selinux_setup"); return init.contains("selinux_setup");
} }
const char *backup_init() {
if (access("/.backup/init.real", F_OK) == 0)
return "/.backup/init.real";
return "/.backup/init";
}

View File

@ -59,7 +59,7 @@ public:
RecoveryInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {} RecoveryInit(char *argv[], BootConfig *cmd) : BaseInit(argv, cmd) {}
void start() override { void start() override {
LOGD("Ramdisk is recovery, abort\n"); LOGD("Ramdisk is recovery, abort\n");
rename("/.backup/init", "/init"); rename(backup_init(), "/init");
rm_rf("/.backup"); rm_rf("/.backup");
exec_init(); exec_init();
} }

View File

@ -40,6 +40,7 @@ bool unxz(int fd, const uint8_t *buf, size_t size);
void load_kernel_info(BootConfig *config); void load_kernel_info(BootConfig *config);
bool check_two_stage(); bool check_two_stage();
void setup_klog(); void setup_klog();
const char *backup_init();
/*************** /***************
* Base classes * Base classes

View File

@ -289,7 +289,7 @@ void RootFSInit::early_mount() {
self = mmap_data::ro("/init"); self = mmap_data::ro("/init");
LOGD("Restoring /init\n"); LOGD("Restoring /init\n");
rename("/.backup/init", "/init"); rename(backup_init(), "/init");
mount_with_dt(); mount_with_dt();
} }

View File

@ -61,7 +61,7 @@ void FirstStageInit::prepare() {
xmkdirs(FSR "/system/bin", 0755); xmkdirs(FSR "/system/bin", 0755);
rename("/init" /* magiskinit */, FSR "/system/bin/init"); rename("/init" /* magiskinit */, FSR "/system/bin/init");
symlink("/system/bin/init", FSR "/init"); symlink("/system/bin/init", FSR "/init");
rename("/.backup/init", "/init"); rename(backup_init(), "/init");
rename("/.backup", FSR "/.backup"); rename("/.backup", FSR "/.backup");
rename("/overlay.d", FSR "/overlay.d"); rename("/overlay.d", FSR "/overlay.d");
@ -71,7 +71,7 @@ void FirstStageInit::prepare() {
xmkdir("/system", 0755); xmkdir("/system", 0755);
xmkdir("/system/bin", 0755); xmkdir("/system/bin", 0755);
rename("/init" /* magiskinit */ , "/system/bin/init"); rename("/init" /* magiskinit */ , "/system/bin/init");
rename("/.backup/init", "/init"); rename(backup_init(), "/init");
} }
char fstab_file[128]; char fstab_file[128];

View File

@ -58,9 +58,9 @@ Supported actions:
extract [ENTRY OUT] extract [ENTRY OUT]
Extract ENTRY to OUT, or extract all entries to current directory Extract ENTRY to OUT, or extract all entries to current directory
test test
Test the current cpio's patch status Test the current cpio's status
Return values: Return value is 0 or bitwise or-ed of following values:
0:stock 1:Magisk 2:unsupported (phh, SuperSU, Xposed) 0x1:Magisk 0x2:unsupported 0x4:Sony
patch patch
Apply ramdisk patches Apply ramdisk patches
Configure with env variables: KEEPVERITY KEEPFORCEENCRYPT Configure with env variables: KEEPVERITY KEEPFORCEENCRYPT

View File

@ -59,11 +59,12 @@ void magisk_cpio::patch() {
} }
} }
#define STOCK_BOOT 0
#define MAGISK_PATCHED (1 << 0) #define MAGISK_PATCHED (1 << 0)
#define UNSUPPORTED_CPIO (1 << 1) #define UNSUPPORTED_CPIO (1 << 1)
#define SONY_INIT (1 << 2)
int magisk_cpio::test() { int magisk_cpio::test() {
int ret = 0;
for (auto file : UNSUPPORT_LIST) { for (auto file : UNSUPPORT_LIST) {
if (exists(file)) { if (exists(file)) {
return UNSUPPORTED_CPIO; return UNSUPPORTED_CPIO;
@ -71,10 +72,13 @@ int magisk_cpio::test() {
} }
for (auto file : MAGISK_LIST) { for (auto file : MAGISK_LIST) {
if (exists(file)) { if (exists(file)) {
return MAGISK_PATCHED; ret |= MAGISK_PATCHED;
break;
} }
} }
return STOCK_BOOT; if (exists("init.real"))
ret |= SONY_INIT;
return ret;
} }
#define for_each_line(line, buf, size) \ #define for_each_line(line, buf, size) \

View File

@ -135,6 +135,12 @@ case $((STATUS & 3)) in
;; ;;
esac esac
# Work around custom legacy Sony /init -> /(s)bin/init_sony : /init.real setup
INIT=init
if [ $((status & 0x4)) -ne 0 ]; then
INIT=init.real
fi
################## ##################
# Ramdisk Patches # Ramdisk Patches
################## ##################
@ -158,8 +164,16 @@ if [ -f magisk64 ]; then
unset SKIP64 unset SKIP64
fi fi
# Work around custom legacy Sony /init -> /(s)bin/init_sony : /init.real setup
INIT=init
SKIPSONY="#"
if ./magiskboot cpio ramdisk.cpio "exists init.real"; then
INIT=init.real
unset SKIPSONY
fi
./magiskboot cpio ramdisk.cpio \ ./magiskboot cpio ramdisk.cpio \
"add 0750 init magiskinit" \ "add 0750 $INIT magiskinit" \
"mkdir 0750 overlay.d" \ "mkdir 0750 overlay.d" \
"mkdir 0750 overlay.d/sbin" \ "mkdir 0750 overlay.d/sbin" \
"$SKIP32 add 0644 overlay.d/sbin/magisk32.xz magisk32.xz" \ "$SKIP32 add 0644 overlay.d/sbin/magisk32.xz magisk32.xz" \

View File

@ -125,6 +125,10 @@ case $((STATUS & 3)) in
else else
ui_print "! Boot image backup unavailable" ui_print "! Boot image backup unavailable"
ui_print "- Restoring ramdisk with internal backup" ui_print "- Restoring ramdisk with internal backup"
if ./magiskboot cpio ramdisk.cpio "exists init.real"; then
# Work around custom legacy Sony /init -> /(s)bin/init_sony : /init.real setup
./magiskboot cpio ramdisk.cpio "mv .backup/init .backup/init.real"
fi
./magiskboot cpio ramdisk.cpio restore ./magiskboot cpio ramdisk.cpio restore
if ! ./magiskboot cpio ramdisk.cpio "exists init"; then if ! ./magiskboot cpio ramdisk.cpio "exists init"; then
# A only system-as-root # A only system-as-root