From a74c433d22faa74ec7d16fd7b7f5cdbcbc4aaef8 Mon Sep 17 00:00:00 2001 From: Ziyang Zhou Date: Sun, 9 May 2021 23:09:00 +0800 Subject: [PATCH 1/7] fix booting --- fs_mgr/libfstab/boot_config.cpp | 6 ++++-- init/first_stage_init.cpp | 18 +++++++++++++++--- init/init.cpp | 0 init/property_service.cpp | 0 init/service.cpp | 1 + libcutils/ashmem-dev.cpp | 2 +- rootdir/init.rc | 2 +- 7 files changed, 22 insertions(+), 7 deletions(-) mode change 100644 => 100755 init/init.cpp mode change 100644 => 100755 init/property_service.cpp diff --git a/fs_mgr/libfstab/boot_config.cpp b/fs_mgr/libfstab/boot_config.cpp index b21495e..7993d15 100644 --- a/fs_mgr/libfstab/boot_config.cpp +++ b/fs_mgr/libfstab/boot_config.cpp @@ -154,13 +154,15 @@ bool GetKernelCmdlineFromString(const std::string& cmdline, const std::string& k void ImportKernelCmdline(const std::function& fn) { std::string cmdline; - android::base::ReadFileToString("/proc/cmdline", &cmdline); + android::base::ReadFileToString("/proc/self/cmdline", &cmdline); // HACKED + std::replace(cmdline.begin(), cmdline.end(), '\0', ' '); // HACKED ImportKernelCmdlineFromString(android::base::Trim(cmdline), fn); } bool GetKernelCmdline(const std::string& key, std::string* out) { std::string cmdline; - android::base::ReadFileToString("/proc/cmdline", &cmdline); + android::base::ReadFileToString("/proc/self/cmdline", &cmdline); // HACKED + std::replace(cmdline.begin(), cmdline.end(), '\0', ' '); // HACKED return GetKernelCmdlineFromString(android::base::Trim(cmdline), key, out); } diff --git a/init/first_stage_init.cpp b/init/first_stage_init.cpp index e06a645..6406662 100644 --- a/init/first_stage_init.cpp +++ b/init/first_stage_init.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -352,6 +353,8 @@ int FirstStageMain(int argc, char** argv) { CHECKCALL(mkdir("/dev/pts", 0755)); CHECKCALL(mkdir("/dev/socket", 0755)); CHECKCALL(mkdir("/dev/dm-user", 0755)); + mount("/system/etc", "/etc", "none", MS_BIND, NULL); // cgroup fix + unshare(CLONE_NEWCGROUP); CHECKCALL(mount("devpts", "/dev/pts", "devpts", 0, NULL)); #define MAKE_STR(x) __STRING(x) CHECKCALL(mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC))); @@ -420,7 +423,6 @@ int FirstStageMain(int argc, char** argv) { for (const auto& [error_string, error_errno] : errors) { LOG(ERROR) << error_string << " " << strerror(error_errno); } - LOG(FATAL) << "Init encountered errors starting first stage, aborting"; } LOG(INFO) << "init first stage started!"; @@ -557,12 +559,22 @@ int FirstStageMain(int argc, char** argv) { 1); const char* path = "/system/bin/init"; - const char* args[] = {path, "selinux_setup", nullptr}; + std::vector args = {path, "second_stage"}; + std::string init_cmdline; + android::base::ReadFileToString("/proc/self/cmdline", &init_cmdline); + std::replace(init_cmdline.begin(), init_cmdline.end(), '\0', ' '); + auto cmd_vector = android::base::Split(android::base::Trim(init_cmdline), " "); + int i = 0; + for (const auto& entry : cmd_vector) { + if (i++ == 0) continue; // ignore first arg '/init' + args.push_back(entry.c_str()); + } + args.push_back(nullptr); auto fd = open("/dev/kmsg", O_WRONLY | O_CLOEXEC); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); close(fd); - execv(path, const_cast(args)); + execv(path, const_cast(args.data())); // execv() only returns if an error happened, in which case we // panic and never fall through this conditional. diff --git a/init/init.cpp b/init/init.cpp old mode 100644 new mode 100755 diff --git a/init/property_service.cpp b/init/property_service.cpp old mode 100644 new mode 100755 diff --git a/init/service.cpp b/init/service.cpp index 5630020..bd1f43f 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -77,6 +77,7 @@ namespace android { namespace init { static Result ComputeContextFromExecutable(const std::string& service_path) { + se_hack1("HACKED"); std::string computed_context; char* raw_con = nullptr; diff --git a/libcutils/ashmem-dev.cpp b/libcutils/ashmem-dev.cpp index 80c4f4c..f4d9e2a 100644 --- a/libcutils/ashmem-dev.cpp +++ b/libcutils/ashmem-dev.cpp @@ -176,7 +176,7 @@ static int __ashmem_open_locked() { return -1; } - android::base::unique_fd fd(TEMP_FAILURE_RETRY(open(ashmem_device_path.c_str(), O_RDWR | O_CLOEXEC))); + android::base::unique_fd fd(TEMP_FAILURE_RETRY(open("/dev/ashmem", O_RDWR | O_CLOEXEC))); if (!fd.ok()) { ALOGE("Unable to open ashmem device: %m"); return -1; diff --git a/rootdir/init.rc b/rootdir/init.rc index 471059b..52c967d 100644 --- a/rootdir/init.rc +++ b/rootdir/init.rc @@ -15,6 +15,7 @@ import /system/etc/init/hw/init.${ro.zygote}.rc on early-init # Disable sysrq from keyboard write /proc/sys/kernel/sysrq 0 + mount sysfs sysfs /sys remount rw nodev # Android doesn't need kernel module autoloading, and it causes SELinux # denials. So disable it by setting modprobe to the empty string. Note: to @@ -541,7 +542,6 @@ on post-fs # Once everything is setup, no need to modify /. # The bind+remount combination allows this to work in containers. - mount rootfs rootfs / remount bind ro nodev # Mount default storage into root namespace mount none /mnt/user/0 /storage bind rec -- 2.49.0