mirror of
https://github.com/topjohnwu/Magisk.git
synced 2024-11-24 10:35:26 +00:00
49f259065d
In the current implementation, Magisk will either have to recreate all early mount implementation (for legacy SAR and rootfs devices) or delegate early mount to first stage init (for 2SI devices) to access required partitions for loading sepolicy. It then has to recreate the split sepolicy loading implementation in-house, apply patches, then dump the compiled + patched policies into monolithic format somewhere. Finally, it patches the original init to force it to load the sepolicy file we just created. With the increasing complexity involved in early mount and split sepolicy (there is even APEX module involved in the future!), it is about time to rethink Magisk's sepolicy strategy as rebuilding init's functionality is not scalable and easy to maintain. In this commit, instead of building sepolicy ourselves, we mock selinuxfs with FIFO files connected to a pre-init daemon, waiting for the actual init process to directly write the sepolicy file into MagiskInit. We then patch the file and load it into the kernel. Some FIFO tricks has to be used to hijack the original init process's control flow and prevent race conditions, details are directly in the comments in code. At the moment, only system-as-root (read-only root) support is added. Support for legacy rootfs devices will come with a follow up commit.
48 lines
1.7 KiB
C++
48 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
|
|
// magiskinit will hex patch this constant,
|
|
// appending \0 to prevent the compiler from reusing the string for "1"
|
|
#define MAIN_SOCKET "d30138f2310a9fb9c54a3e0c21f58591\0"
|
|
#define JAVA_PACKAGE_NAME "com.topjohnwu.magisk"
|
|
#define LOGFILE "/cache/magisk.log"
|
|
#define UNBLOCKFILE "/dev/.magisk_unblock"
|
|
#define SECURE_DIR "/data/adb"
|
|
#define MODULEROOT SECURE_DIR "/modules"
|
|
#define MODULEUPGRADE SECURE_DIR "/modules_update"
|
|
#define DATABIN SECURE_DIR "/magisk"
|
|
#define MAGISKDB SECURE_DIR "/magisk.db"
|
|
#define MANAGERAPK DATABIN "/magisk.apk"
|
|
|
|
// tmpfs paths
|
|
extern std::string MAGISKTMP;
|
|
#define INTLROOT ".magisk"
|
|
#define MIRRDIR INTLROOT "/mirror"
|
|
#define RULESDIR MIRRDIR "/sepolicy.rules"
|
|
#define BLOCKDIR INTLROOT "/block"
|
|
#define MODULEMNT INTLROOT "/modules"
|
|
#define BBPATH INTLROOT "/busybox"
|
|
#define ROOTOVL INTLROOT "/rootdir"
|
|
#define SHELLPTS INTLROOT "/pts"
|
|
#define ROOTMNT ROOTOVL "/.mount_list"
|
|
#define ZYGISKBIN INTLROOT "/zygisk"
|
|
#define SELINUXMOCK INTLROOT "/selinux"
|
|
|
|
constexpr const char *applet_names[] = { "su", "resetprop", nullptr };
|
|
constexpr const char *init_applet[] = { "magiskpolicy", "supolicy", nullptr };
|
|
|
|
#define POST_FS_DATA_WAIT_TIME 40
|
|
#define POST_FS_DATA_SCRIPT_MAX_TIME 35
|
|
|
|
extern int SDK_INT;
|
|
#define APP_DATA_DIR (SDK_INT >= 24 ? "/data/user_de" : "/data/user")
|
|
|
|
// Multi-call entrypoints
|
|
int magisk_main(int argc, char *argv[]);
|
|
int magiskpolicy_main(int argc, char *argv[]);
|
|
int su_client_main(int argc, char *argv[]);
|
|
int resetprop_main(int argc, char *argv[]);
|
|
int app_process_main(int argc, char *argv[]);
|
|
int zygisk_main(int argc, char *argv[]);
|