From 0469817781c00982aced6b66551bf51ab7e0fd2e Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Sun, 2 Feb 2025 12:57:09 +0800 Subject: [PATCH] Cleanup code and bindings --- native/src/Android.mk | 1 - native/src/core/daemon.cpp | 32 +++++++++++++++++ native/src/core/daemon.rs | 7 ++-- native/src/core/db.rs | 56 ++++++++++++++++++------------ native/src/core/include/core.hpp | 41 +++++++++++++++++++++- native/src/core/include/socket.hpp | 49 -------------------------- native/src/core/lib.rs | 47 ++----------------------- native/src/core/module.cpp | 6 ++-- native/src/core/socket.cpp | 47 ------------------------- native/src/core/socket.rs | 4 +-- native/src/core/su/connect.cpp | 5 --- native/src/core/su/daemon.rs | 7 ++-- native/src/core/su/db.rs | 21 ++++------- 13 files changed, 125 insertions(+), 198 deletions(-) delete mode 100644 native/src/core/include/socket.hpp delete mode 100644 native/src/core/socket.cpp diff --git a/native/src/Android.mk b/native/src/Android.mk index f02269e2e..ef2f23dd1 100644 --- a/native/src/Android.mk +++ b/native/src/Android.mk @@ -18,7 +18,6 @@ LOCAL_SRC_FILES := \ core/applets.cpp \ core/magisk.cpp \ core/daemon.cpp \ - core/socket.cpp \ core/scripting.cpp \ core/selinux.cpp \ core/sqlite.cpp \ diff --git a/native/src/core/daemon.cpp b/native/src/core/daemon.cpp index 05bd97247..0e1b39379 100644 --- a/native/src/core/daemon.cpp +++ b/native/src/core/daemon.cpp @@ -136,6 +136,38 @@ void MagiskD::reboot() const noexcept { exec_command_sync("/system/bin/reboot"); } +bool get_client_cred(int fd, sock_cred *cred) { + socklen_t len = sizeof(ucred); + if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, cred, &len) != 0) + return false; + char buf[4096]; + len = sizeof(buf); + if (getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &len) != 0) + len = 0; + buf[len] = '\0'; + cred->context = buf; + return true; +} + +bool read_string(int fd, std::string &str) { + str.clear(); + auto len = read_any(fd); + str.resize(len); + return xxread(fd, str.data(), len) == len; +} + +string read_string(int fd) { + string str; + read_string(fd, str); + return str; +} + +void write_string(int fd, string_view str) { + if (fd < 0) return; + write_any(fd, str.size()); + xwrite(fd, str.data(), str.size()); +} + static void handle_request_async(int client, int code, const sock_cred &cred) { auto &daemon = MagiskD::Get(); switch (code) { diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs index e74934270..a5a5e8134 100644 --- a/native/src/core/daemon.rs +++ b/native/src/core/daemon.rs @@ -91,10 +91,6 @@ impl MagiskD { self.sdk_int } - pub fn set_module_list(&self, module_list: Vec) { - self.module_list.set(module_list).ok(); - } - pub fn app_data_dir(&self) -> &'static Utf8CStr { if self.sdk_int >= 24 { cstr!("/data/user_de") @@ -152,7 +148,8 @@ impl MagiskD { ); initialize_denylist(); setup_mounts(); - self.handle_modules(); + let modules = self.handle_modules(); + self.module_list.set(modules).ok(); false } diff --git a/native/src/core/db.rs b/native/src/core/db.rs index 05245401a..3160d3e53 100644 --- a/native/src/core/db.rs +++ b/native/src/core/db.rs @@ -1,11 +1,12 @@ #![allow(improper_ctypes, improper_ctypes_definitions)] use crate::daemon::{MagiskD, MAGISKD}; use crate::ffi::{ - open_and_init_db, sqlite3, sqlite3_errstr, DbEntryKey, DbSettings, DbStatement, DbValues, - MntNsMode, MultiuserMode, RootAccess, + open_and_init_db, sqlite3, sqlite3_errstr, DbEntryKey, DbStatement, DbValues, MntNsMode, }; use crate::socket::{IpcRead, IpcWrite}; use base::{LoggedResult, ResultExt, Utf8CStr}; +use num_derive::FromPrimitive; +use num_traits::FromPrimitive; use std::ffi::c_void; use std::fs::File; use std::io::{BufReader, BufWriter}; @@ -55,16 +56,33 @@ where } } -impl Default for RootAccess { - fn default() -> Self { - RootAccess::AppsAndAdb - } +#[derive(Default)] +pub struct DbSettings { + pub root_access: RootAccess, + pub multiuser_mode: MultiuserMode, + pub mnt_ns: MntNsMode, + pub boot_count: i32, + pub denylist: bool, + pub zygisk: bool, } -impl Default for MultiuserMode { - fn default() -> Self { - MultiuserMode::OwnerOnly - } +#[repr(i32)] +#[derive(Default, FromPrimitive)] +pub enum RootAccess { + Disabled, + AppsOnly, + AdbOnly, + #[default] + AppsAndAdb, +} + +#[repr(i32)] +#[derive(Default, FromPrimitive)] +pub enum MultiuserMode { + #[default] + OwnerOnly, + OwnerManaged, + User, } impl Default for MntNsMode { @@ -100,8 +118,10 @@ impl SqlTable for DbSettings { } } match key { - "root_access" => self.root_access = RootAccess { repr: value }, - "multiuser_mode" => self.multiuser_mode = MultiuserMode { repr: value }, + "root_access" => self.root_access = RootAccess::from_i32(value).unwrap_or_default(), + "multiuser_mode" => { + self.multiuser_mode = MultiuserMode::from_i32(value).unwrap_or_default() + } "mnt_ns" => self.mnt_ns = MntNsMode { repr: value }, "denylist" => self.denylist = value != 0, "zygisk" => self.zygisk = value != 0, @@ -226,8 +246,8 @@ impl MagiskD { pub fn get_db_setting(&self, key: DbEntryKey) -> i32 { // Get default values let mut val = match key { - DbEntryKey::RootAccess => RootAccess::default().repr, - DbEntryKey::SuMultiuserMode => MultiuserMode::default().repr, + DbEntryKey::RootAccess => RootAccess::default() as i32, + DbEntryKey::SuMultiuserMode => MultiuserMode::default() as i32, DbEntryKey::SuMntNs => MntNsMode::default().repr, DbEntryKey::DenylistConfig => 0, DbEntryKey::ZygiskConfig => self.is_emulator as i32, @@ -302,14 +322,6 @@ impl MagiskD { } impl MagiskD { - pub fn get_db_settings_for_cxx(&self, cfg: &mut DbSettings) -> bool { - cfg.zygisk = self.is_emulator; - self.db_exec_with_rows("SELECT * FROM settings", &[], cfg) - .sql_result() - .log() - .is_ok() - } - pub fn set_db_setting_for_cxx(&self, key: DbEntryKey, value: i32) -> bool { self.set_db_setting(key, value).log().is_ok() } diff --git a/native/src/core/include/core.hpp b/native/src/core/include/core.hpp index 2942780e6..f164cefdd 100644 --- a/native/src/core/include/core.hpp +++ b/native/src/core/include/core.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -9,7 +10,6 @@ #include -#include "socket.hpp" #include "../core-rs.hpp" #define AID_ROOT 0 @@ -40,6 +40,45 @@ bool setup_magisk_env(); bool check_key_combo(); void restore_zygisk_prop(); +// Sockets +struct sock_cred : public ucred { + std::string context; +}; + +template requires(std::is_trivially_copyable_v) +T read_any(int fd) { + T val; + if (xxread(fd, &val, sizeof(val)) != sizeof(val)) + return -1; + return val; +} + +template requires(std::is_trivially_copyable_v) +void write_any(int fd, T val) { + if (fd < 0) return; + xwrite(fd, &val, sizeof(val)); +} + +template requires(std::is_trivially_copyable_v) +void write_vector(int fd, const std::vector &vec) { + write_any(fd, vec.size()); + xwrite(fd, vec.data(), vec.size() * sizeof(T)); +} + +template requires(std::is_trivially_copyable_v) +bool read_vector(int fd, std::vector &vec) { + auto size = read_any(fd); + vec.resize(size); + return xread(fd, vec.data(), size * sizeof(T)) == size * sizeof(T); +} + +bool get_client_cred(int fd, sock_cred *cred); +static inline int read_int(int fd) { return read_any(fd); } +static inline void write_int(int fd, int val) { write_any(fd, val); } +std::string read_string(int fd); +bool read_string(int fd, std::string &str); +void write_string(int fd, std::string_view str); + // Poll control using poll_callback = void(*)(pollfd*); void register_poll(const pollfd *pfd, poll_callback callback); diff --git a/native/src/core/include/socket.hpp b/native/src/core/include/socket.hpp deleted file mode 100644 index 1f4c2832b..000000000 --- a/native/src/core/include/socket.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include - -struct sock_cred : public ucred { - std::string context; -}; - -template requires(std::is_trivially_copyable_v) -T read_any(int fd) { - T val; - if (xxread(fd, &val, sizeof(val)) != sizeof(val)) - return -1; - return val; -} - -template requires(std::is_trivially_copyable_v) -void write_any(int fd, T val) { - if (fd < 0) return; - xwrite(fd, &val, sizeof(val)); -} - -template requires(std::is_trivially_copyable_v) -void write_vector(int fd, const std::vector &vec) { - write_any(fd, vec.size()); - xwrite(fd, vec.data(), vec.size() * sizeof(T)); -} - -template requires(std::is_trivially_copyable_v) -bool read_vector(int fd, std::vector &vec) { - auto size = read_any(fd); - vec.resize(size); - return xread(fd, vec.data(), size * sizeof(T)) == size * sizeof(T); -} - -bool get_client_cred(int fd, sock_cred *cred); -static inline int read_int(int fd) { return read_any(fd); } -int read_int_be(int fd); -static inline void write_int(int fd, int val) { write_any(fd, val); } -void write_int_be(int fd, int val); -std::string read_string(int fd); -bool read_string(int fd, std::string &str); -void write_string(int fd, std::string_view str); diff --git a/native/src/core/lib.rs b/native/src/core/lib.rs index 1815e8dcf..ce6cda9e7 100644 --- a/native/src/core/lib.rs +++ b/native/src/core/lib.rs @@ -34,6 +34,7 @@ mod socket; mod su; mod zygisk; +#[allow(clippy::needless_lifetimes)] #[cxx::bridge] pub mod ffi { #[repr(i32)] @@ -71,21 +72,6 @@ pub mod ffi { SuManager, } - #[repr(i32)] - enum RootAccess { - Disabled, - AppsOnly, - AdbOnly, - AppsAndAdb, - } - - #[repr(i32)] - enum MultiuserMode { - OwnerOnly, - OwnerManaged, - User, - } - #[repr(i32)] enum MntNsMode { Global, @@ -93,16 +79,6 @@ pub mod ffi { Isolate, } - #[derive(Default)] - struct DbSettings { - root_access: RootAccess, - multiuser_mode: MultiuserMode, - mnt_ns: MntNsMode, - boot_count: i32, - denylist: bool, - zygisk: bool, - } - #[repr(i32)] enum SuPolicy { Query, @@ -110,12 +86,6 @@ pub mod ffi { Allow, } - struct RootSettings { - policy: SuPolicy, - log: bool, - notify: bool, - } - struct ModuleInfo { name: String, z32: i32, @@ -242,14 +212,6 @@ pub mod ffi { // Default constructors extern "Rust" { - #[Self = DbSettings] - #[cxx_name = "New"] - fn default() -> DbSettings; - - #[Self = RootSettings] - #[cxx_name = "New"] - fn default() -> RootSettings; - #[Self = SuRequest] #[cxx_name = "New"] fn default() -> SuRequest; @@ -268,17 +230,12 @@ pub mod ffi { fn su_daemon_handler(&self, client: i32, cred: &UCred); #[cxx_name = "get_manager"] unsafe fn get_manager_for_cxx(&self, user: i32, ptr: *mut CxxString, install: bool) -> i32; - fn set_module_list(&self, module_list: Vec); - #[cxx_name = "get_db_settings"] - fn get_db_settings_for_cxx(&self, cfg: &mut DbSettings) -> bool; fn get_db_setting(&self, key: DbEntryKey) -> i32; #[cxx_name = "set_db_setting"] fn set_db_setting_for_cxx(&self, key: DbEntryKey, value: i32) -> bool; #[cxx_name = "db_exec"] fn db_exec_for_cxx(&self, client_fd: i32); - #[cxx_name = "get_root_settings"] - fn get_root_settings_for_cxx(&self, uid: i32, settings: &mut RootSettings) -> bool; #[Self = MagiskD] #[cxx_name = "Get"] @@ -287,7 +244,7 @@ pub mod ffi { unsafe extern "C++" { #[allow(dead_code)] fn reboot(self: &MagiskD); - fn handle_modules(self: &MagiskD); + fn handle_modules(self: &MagiskD) -> Vec; } } diff --git a/native/src/core/module.cpp b/native/src/core/module.cpp index 57843e308..7eca0751a 100644 --- a/native/src/core/module.cpp +++ b/native/src/core/module.cpp @@ -466,22 +466,20 @@ static rust::Vec collect_modules(bool zygisk_enabled, bool open_zygi }; std::for_each(modules.begin(),modules.end(), [&](ModuleInfo &info) { info.z32 = convert_to_memfd(info.z32); -#if defined(__LP64__) info.z64 = convert_to_memfd(info.z64); -#endif }); } return modules; } -void MagiskD::handle_modules() const noexcept { +rust::Vec MagiskD::handle_modules() const noexcept { bool zygisk = zygisk_enabled(); prepare_modules(); exec_module_scripts("post-fs-data", collect_modules(zygisk, false)); // Recollect modules (module scripts could remove itself) auto list = collect_modules(zygisk, true); load_modules(zygisk, list); - set_module_list(std::move(list)); + return list; } static int check_rules_dir(char *buf, size_t sz) { diff --git a/native/src/core/socket.cpp b/native/src/core/socket.cpp deleted file mode 100644 index cd1c22cde..000000000 --- a/native/src/core/socket.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include -#include - -#include -#include - -using namespace std; - -bool get_client_cred(int fd, sock_cred *cred) { - socklen_t len = sizeof(ucred); - if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, cred, &len) != 0) - return false; - char buf[4096]; - len = sizeof(buf); - if (getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &len) != 0) - len = 0; - buf[len] = '\0'; - cred->context = buf; - return true; -} - -int read_int_be(int fd) { - return ntohl(read_int(fd)); -} - -void write_int_be(int fd, int val) { - write_int(fd, htonl(val)); -} - -bool read_string(int fd, std::string &str) { - str.clear(); - auto len = read_any(fd); - str.resize(len); - return xxread(fd, str.data(), len) == len; -} - -string read_string(int fd) { - string str; - read_string(fd, str); - return str; -} - -void write_string(int fd, string_view str) { - if (fd < 0) return; - write_any(fd, str.size()); - xwrite(fd, str.data(), str.size()); -} diff --git a/native/src/core/socket.rs b/native/src/core/socket.rs index 111719e27..06b339578 100644 --- a/native/src/core/socket.rs +++ b/native/src/core/socket.rs @@ -87,11 +87,11 @@ impl Decodable for Vec { impl Encodable for str { fn encoded_len(&self) -> usize { - size_of::() + self.as_bytes().len() + size_of::() + self.len() } fn encode(&self, w: &mut impl Write) -> io::Result<()> { - self.as_bytes().len().encode(w)?; + self.len().encode(w)?; w.write_all(self.as_bytes()) } } diff --git a/native/src/core/su/connect.cpp b/native/src/core/su/connect.cpp index c252bd789..f891b8539 100644 --- a/native/src/core/su/connect.cpp +++ b/native/src/core/su/connect.cpp @@ -20,11 +20,6 @@ using namespace std; // 0x18800020 = FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_MULTIPLE_TASK| // FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS|FLAG_INCLUDE_STOPPED_PACKAGES -#define get_cmd(to) \ -((to).command.empty() ? \ -((to).shell.empty() ? DEFAULT_SHELL : (to).shell.data()) : \ -(to).command.data()) - class Extra { const char *key; enum { diff --git a/native/src/core/su/daemon.rs b/native/src/core/su/daemon.rs index 0c862269e..5a4378126 100644 --- a/native/src/core/su/daemon.rs +++ b/native/src/core/su/daemon.rs @@ -1,9 +1,10 @@ use crate::daemon::{to_app_id, to_user_id, MagiskD, AID_ROOT, AID_SHELL}; +use crate::db::{DbSettings, MultiuserMode, RootAccess}; use crate::ffi::{ - app_log, app_notify, app_request, exec_root_shell, DbSettings, MultiuserMode, RootAccess, - RootSettings, SuAppRequest, SuPolicy, SuRequest, + app_log, app_notify, app_request, exec_root_shell, SuAppRequest, SuPolicy, SuRequest, }; use crate::socket::IpcRead; +use crate::su::db::RootSettings; use crate::UCred; use base::{debug, error, exit_on_error, libc, warn, LoggedResult, ResultExt, WriteExt}; use std::fs::File; @@ -133,7 +134,7 @@ impl MagiskD { let info = self.get_su_info(cred.uid as i32); let app_req = SuAppRequest { uid: cred.uid as i32, - pid: cred.pid as i32, + pid: cred.pid, eval_uid: info.eval_uid, mgr_pkg: &info.mgr_pkg, mgr_uid: info.mgr_uid, diff --git a/native/src/core/su/db.rs b/native/src/core/su/db.rs index 7ed8afc73..12dfbb647 100644 --- a/native/src/core/su/db.rs +++ b/native/src/core/su/db.rs @@ -2,8 +2,8 @@ use crate::daemon::{ to_app_id, to_user_id, MagiskD, AID_APP_END, AID_APP_START, AID_ROOT, AID_SHELL, }; use crate::db::DbArg::Integer; -use crate::db::{SqlTable, SqliteResult, SqliteReturn}; -use crate::ffi::{DbValues, MultiuserMode, RootAccess, RootSettings, SuPolicy}; +use crate::db::{MultiuserMode, RootAccess, SqlTable, SqliteResult, SqliteReturn}; +use crate::ffi::{DbValues, SuPolicy}; use base::ResultExt; impl Default for SuPolicy { @@ -12,14 +12,11 @@ impl Default for SuPolicy { } } -impl Default for RootSettings { - fn default() -> Self { - RootSettings { - policy: Default::default(), - log: true, - notify: true, - } - } +#[derive(Default)] +pub struct RootSettings { + pub policy: SuPolicy, + pub log: bool, + pub notify: bool, } impl SqlTable for RootSettings { @@ -56,10 +53,6 @@ impl MagiskD { .sql_result() } - pub fn get_root_settings_for_cxx(&self, uid: i32, settings: &mut RootSettings) -> bool { - self.get_root_settings(uid, settings).log().is_ok() - } - pub fn prune_su_access(&self) { let mut list = UidList(Vec::new()); if self