Detect 2SI after system_root mount on legacy SAR
This commit is contained in:
parent
dead74801d
commit
ff0a76606e
@ -166,18 +166,14 @@ int main(int argc, char *argv[]) {
|
||||
// This will also mount /sys and /proc
|
||||
load_kernel_info(&cmd);
|
||||
|
||||
bool two_stage = check_two_stage();
|
||||
if (cmd.skip_initramfs) {
|
||||
if (two_stage)
|
||||
init = new SARFirstStageInit(argv, &cmd);
|
||||
else
|
||||
init = new SARInit(argv, &cmd);
|
||||
init = new SARInit(argv, &cmd);
|
||||
} else {
|
||||
if (cmd.force_normal_boot)
|
||||
init = new FirstStageInit(argv, &cmd);
|
||||
else if (access("/sbin/recovery", F_OK) == 0 || access("/system/bin/recovery", F_OK) == 0)
|
||||
init = new RecoveryInit(argv, &cmd);
|
||||
else if (two_stage)
|
||||
else if (check_two_stage())
|
||||
init = new FirstStageInit(argv, &cmd);
|
||||
else
|
||||
init = new RootFSInit(argv, &cmd);
|
||||
|
@ -128,28 +128,21 @@ public:
|
||||
*************/
|
||||
|
||||
class SARInit : public SARBase {
|
||||
protected:
|
||||
void early_mount() override;
|
||||
public:
|
||||
SARInit(char *argv[], cmdline *cmd) : SARBase(argv, cmd) {
|
||||
LOGD("%s\n", __FUNCTION__);
|
||||
};
|
||||
};
|
||||
|
||||
// Special case for legacy SAR on Android 10+
|
||||
// Should be followed by normal 2SI SecondStageInit
|
||||
class SARFirstStageInit : public SARBase {
|
||||
private:
|
||||
void prepare();
|
||||
bool is_two_stage;
|
||||
void first_stage_prep();
|
||||
protected:
|
||||
void early_mount() override;
|
||||
public:
|
||||
SARFirstStageInit(char *argv[], cmdline *cmd) : SARBase(argv, cmd) {
|
||||
SARInit(char *argv[], cmdline *cmd) : SARBase(argv, cmd), is_two_stage(false) {
|
||||
LOGD("%s\n", __FUNCTION__);
|
||||
};
|
||||
void start() override {
|
||||
early_mount();
|
||||
prepare();
|
||||
if (is_two_stage)
|
||||
first_stage_prep();
|
||||
else
|
||||
patch_rootdir();
|
||||
exec_init();
|
||||
}
|
||||
};
|
||||
|
@ -338,23 +338,22 @@ mount_root:
|
||||
}
|
||||
|
||||
void SARInit::early_mount() {
|
||||
// Make dev writable
|
||||
xmkdir("/dev", 0755);
|
||||
xmount("tmpfs", "/dev", "tmpfs", 0, "mode=755");
|
||||
mount_list.emplace_back("/dev");
|
||||
|
||||
backup_files();
|
||||
|
||||
mount_system_root();
|
||||
switch_root("/system_root");
|
||||
|
||||
mount_with_dt();
|
||||
}
|
||||
|
||||
void SARFirstStageInit::early_mount() {
|
||||
backup_files();
|
||||
mount_system_root();
|
||||
switch_root("/system_root");
|
||||
|
||||
{
|
||||
auto init = raw_data::mmap_ro("/init");
|
||||
is_two_stage = init.contains("selinux_setup");
|
||||
}
|
||||
|
||||
if (!is_two_stage) {
|
||||
// Make dev writable
|
||||
xmkdir("/dev", 0755);
|
||||
xmount("tmpfs", "/dev", "tmpfs", 0, "mode=755");
|
||||
mount_list.emplace_back("/dev");
|
||||
mount_with_dt();
|
||||
}
|
||||
}
|
||||
|
||||
void SecondStageInit::early_mount() {
|
||||
|
@ -139,7 +139,7 @@ void FirstStageInit::prepare() {
|
||||
#define INIT_PATH "/system/bin/init"
|
||||
#define REDIR_PATH "/system/bin/am"
|
||||
|
||||
void SARFirstStageInit::prepare() {
|
||||
void SARInit::first_stage_prep() {
|
||||
int pid = getpid();
|
||||
|
||||
xmount("tmpfs", "/dev", "tmpfs", 0, "mode=755");
|
||||
|
Loading…
Reference in New Issue
Block a user