From 8cc5f096a20a4c6e3989144d161846ab21c0d510 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Thu, 5 Dec 2019 16:29:45 -0500 Subject: [PATCH] Some minor changes --- native/jni/init/early_mount.cpp | 40 +++++++++++++++---------------- native/jni/init/init.h | 1 - native/jni/utils/selinux.cpp | 42 +++++++-------------------------- 3 files changed, 29 insertions(+), 54 deletions(-) diff --git a/native/jni/init/early_mount.cpp b/native/jni/init/early_mount.cpp index 672584ba2..9d7555f66 100644 --- a/native/jni/init/early_mount.cpp +++ b/native/jni/init/early_mount.cpp @@ -20,13 +20,17 @@ struct devinfo { static vector dev_list; +static char partname[32]; +static char fstype[32]; +static char block_dev[64]; + static void parse_device(devinfo *dev, const char *uevent) { dev->partname[0] = '\0'; parse_prop_file(uevent, [=](string_view key, string_view value) -> bool { if (key == "MAJOR") - dev->major = atoi(value.data()); + dev->major = parse_int(value.data()); else if (key == "MINOR") - dev->minor = atoi(value.data()); + dev->minor = parse_int(value.data()); else if (key == "DEVNAME") strcpy(dev->devname, value.data()); else if (key == "PARTNAME") @@ -53,7 +57,7 @@ static void collect_devices() { closedir(dir); } -static dev_t setup_block(const char *partname, char *block_dev = nullptr) { +static dev_t setup_block(char *block_dev = nullptr) { if (dev_list.empty()) collect_devices(); for (;;) { @@ -84,15 +88,7 @@ static bool is_lnk(const char *name) { return S_ISLNK(st.st_mode); } -void BaseInit::cleanup() { - // Unmount in reverse order - for (auto &p : reversed(mount_list)) { - LOGD("Unmount [%s]\n", p.data()); - umount(p.data()); - } -} - -bool MagiskInit::read_dt_fstab(const char *name, char *partname, char *fstype) { +static bool read_dt_fstab(cmdline *cmd, const char *name) { char path[128]; int fd; sprintf(path, "%s/fstab/%s/dev", cmd->dt_dir, name); @@ -112,18 +108,14 @@ bool MagiskInit::read_dt_fstab(const char *name, char *partname, char *fstype) { return false; } -static char partname[32]; -static char fstype[32]; -static char block_dev[64]; - #define link_root(name) \ if (is_lnk("/system_root" name)) \ cp_afc("/system_root" name, name) #define mount_root(name) \ -if (!is_lnk("/" #name) && read_dt_fstab(#name, partname, fstype)) { \ +if (!is_lnk("/" #name) && read_dt_fstab(cmd, #name)) { \ LOGD("Early mount " #name "\n"); \ - setup_block(partname, block_dev); \ + setup_block(block_dev); \ xmkdir("/" #name, 0755); \ xmount(block_dev, "/" #name, fstype, MS_RDONLY, nullptr); \ mount_list.emplace_back("/" #name); \ @@ -151,7 +143,7 @@ void SARCompatInit::early_mount() { LOGD("Early mount system_root\n"); sprintf(partname, "system%s", cmd->slot); - setup_block(partname, block_dev); + setup_block(block_dev); xmkdir("/system_root", 0755); if (xmount(block_dev, "/system_root", "ext4", MS_RDONLY, nullptr)) xmount(block_dev, "/system_root", "erofs", MS_RDONLY, nullptr); @@ -213,7 +205,7 @@ void SARInit::early_mount() { LOGD("Early mount system_root\n"); sprintf(partname, "system%s", cmd->slot); - system_dev = setup_block(partname); + system_dev = setup_block(); xmkdir("/system_root", 0755); if (xmount("/dev/root", "/system_root", "ext4", MS_RDONLY, nullptr)) xmount("/dev/root", "/system_root", "erofs", MS_RDONLY, nullptr); @@ -245,3 +237,11 @@ void SecondStageInit::early_mount() { switch_root("/system_root"); } + +void BaseInit::cleanup() { + // Unmount in reverse order + for (auto &p : reversed(mount_list)) { + LOGD("Unmount [%s]\n", p.data()); + umount(p.data()); + } +} diff --git a/native/jni/init/init.h b/native/jni/init/init.h index cb28a6ffa..8161100d9 100644 --- a/native/jni/init/init.h +++ b/native/jni/init/init.h @@ -55,7 +55,6 @@ protected: raw_data self; virtual void early_mount() = 0; - bool read_dt_fstab(const char *name, char *partname, char *fstype); bool patch_sepolicy(const char *file = "/sepolicy"); public: MagiskInit(char *argv[], cmdline *cmd) : BaseInit(argv, cmd) {}; diff --git a/native/jni/utils/selinux.cpp b/native/jni/utils/selinux.cpp index ed3696191..785b61288 100644 --- a/native/jni/utils/selinux.cpp +++ b/native/jni/utils/selinux.cpp @@ -55,61 +55,37 @@ static int __setcon(const char *ctx) { static int __getfilecon(const char *path, char **ctx) { char buf[1024]; int rc = syscall(__NR_getxattr, path, XATTR_NAME_SELINUX, buf, sizeof(buf) - 1); - if (rc < 0) { - errno = -rc; - return -1; - } - *ctx = strdup(buf); + if (rc == 0) + *ctx = strdup(buf); return rc; } static int __lgetfilecon(const char *path, char **ctx) { char buf[1024]; int rc = syscall(__NR_lgetxattr, path, XATTR_NAME_SELINUX, buf, sizeof(buf) - 1); - if (rc < 0) { - errno = -rc; - return -1; - } - *ctx = strdup(buf); + if (rc == 0) + *ctx = strdup(buf); return rc; } static int __fgetfilecon(int fd, char **ctx) { char buf[1024]; int rc = syscall(__NR_fgetxattr, fd, XATTR_NAME_SELINUX, buf, sizeof(buf) - 1); - if (rc < 0) { - errno = -rc; - return -1; - } - *ctx = strdup(buf); + if (rc == 0) + *ctx = strdup(buf); return rc; } static int __setfilecon(const char *path, const char *ctx) { - int rc = syscall(__NR_setxattr, path, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); - if (rc) { - errno = -rc; - return -1; - } - return 0; + return syscall(__NR_setxattr, path, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); } static int __lsetfilecon(const char *path, const char *ctx) { - int rc = syscall(__NR_lsetxattr, path, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); - if (rc) { - errno = -rc; - return -1; - } - return 0; + return syscall(__NR_lsetxattr, path, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); } static int __fsetfilecon(int fd, const char *ctx) { - int rc = syscall(__NR_fsetxattr, fd, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); - if (rc) { - errno = -rc; - return -1; - } - return 0; + return syscall(__NR_fsetxattr, fd, XATTR_NAME_SELINUX, ctx, strlen(ctx) + 1, 0); } // Function pointers