Fix dependency bug: OnceCell crashes on 32 bit

This commit is contained in:
Nullptr
2023-03-03 17:07:00 +08:00
parent 446ed92f26
commit 49e3ac9d7a
4 changed files with 23 additions and 22 deletions

6
.gitmodules vendored
View File

@@ -1,6 +1,6 @@
[submodule "loader/src/external/liblsplt"] [submodule "loader/src/external/lsplt"]
path = loader/src/external/liblsplt path = loader/src/external/lsplt
url = https://github.com/LSPosed/LSPlt url = https://github.com/LSPosed/lsplt
[submodule "loader/src/external/parallel-hashmap"] [submodule "loader/src/external/parallel-hashmap"]
path = loader/src/external/parallel-hashmap path = loader/src/external/parallel-hashmap
url = https://github.com/greg7mdp/parallel-hashmap url = https://github.com/greg7mdp/parallel-hashmap

View File

@@ -3,14 +3,14 @@ LOCAL_PATH := $(call my-dir)
# liblsplt.a # liblsplt.a
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE:= liblsplt LOCAL_MODULE:= liblsplt
LOCAL_C_INCLUDES := $(LOCAL_PATH)/liblsplt/lsplt/src/main/jni/include LOCAL_C_INCLUDES := $(LOCAL_PATH)/lsplt/lsplt/src/main/jni/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
LOCAL_CFLAGS := -Wall -Wextra -Werror -fvisibility=hidden LOCAL_CFLAGS := -Wall -Wextra -Werror -fvisibility=hidden -DLOG_DISABLED
LOCAL_CPPFLAGS := -std=c++20 LOCAL_CPPFLAGS := -std=c++20
LOCAL_STATIC_LIBRARIES := libcxx LOCAL_STATIC_LIBRARIES := libcxx
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
liblsplt/lsplt/src/main/jni/elf_util.cc \ lsplt/lsplt/src/main/jni/elf_util.cc \
liblsplt/lsplt/src/main/jni/lsplt.cc lsplt/lsplt/src/main/jni/lsplt.cc
include $(BUILD_STATIC_LIBRARY) include $(BUILD_STATIC_LIBRARY)
# Header only library # Header only library

View File

@@ -1,8 +1,6 @@
mod kernelsu; mod kernelsu;
mod magisk; mod magisk;
use once_cell::sync::OnceCell;
pub enum RootImpl { pub enum RootImpl {
None, None,
TooOld, TooOld,
@@ -12,47 +10,50 @@ pub enum RootImpl {
Magisk, Magisk,
} }
static ROOT_IMPL: OnceCell<RootImpl> = OnceCell::new(); // FIXME: OnceCell bugs on 32 bit
static mut ROOT_IMPL: RootImpl = RootImpl::None;
pub fn setup() { pub fn setup() {
let ksu_version = kernelsu::get_kernel_su(); let ksu_version = kernelsu::get_kernel_su();
let magisk_version = magisk::get_magisk(); let magisk_version = magisk::get_magisk();
let _ = match (ksu_version, magisk_version) { let impl_ = match (ksu_version, magisk_version) {
(None, None) => ROOT_IMPL.set(RootImpl::None), (None, None) => RootImpl::None,
(Some(_), Some(_)) => ROOT_IMPL.set(RootImpl::Multiple), (Some(_), Some(_)) => RootImpl::Multiple,
(Some(ksu_version), None) => { (Some(ksu_version), None) => {
let val = match ksu_version { match ksu_version {
kernelsu::Version::Supported => RootImpl::KernelSU, kernelsu::Version::Supported => RootImpl::KernelSU,
kernelsu::Version::TooOld => RootImpl::TooOld, kernelsu::Version::TooOld => RootImpl::TooOld,
kernelsu::Version::Abnormal => RootImpl::Abnormal, kernelsu::Version::Abnormal => RootImpl::Abnormal,
}; }
ROOT_IMPL.set(val)
} }
(None, Some(magisk_version)) => { (None, Some(magisk_version)) => {
let val = match magisk_version { match magisk_version {
magisk::Version::Supported => RootImpl::Magisk, magisk::Version::Supported => RootImpl::Magisk,
magisk::Version::TooOld => RootImpl::TooOld, magisk::Version::TooOld => RootImpl::TooOld,
}; }
ROOT_IMPL.set(val)
} }
}; };
unsafe { ROOT_IMPL = impl_; }
} }
pub fn get_impl() -> &'static RootImpl { pub fn get_impl() -> &'static RootImpl {
ROOT_IMPL.get().unwrap() unsafe { &ROOT_IMPL }
} }
// FIXME: Without #[inline(never)], this function will lag forever
#[inline(never)]
pub fn uid_on_allowlist(uid: i32) -> bool { pub fn uid_on_allowlist(uid: i32) -> bool {
match ROOT_IMPL.get().unwrap() { match get_impl() {
RootImpl::KernelSU => kernelsu::uid_on_allowlist(uid), RootImpl::KernelSU => kernelsu::uid_on_allowlist(uid),
RootImpl::Magisk => magisk::uid_on_allowlist(uid), RootImpl::Magisk => magisk::uid_on_allowlist(uid),
_ => unreachable!(), _ => unreachable!(),
} }
} }
#[inline(never)]
pub fn uid_on_denylist(uid: i32) -> bool { pub fn uid_on_denylist(uid: i32) -> bool {
match ROOT_IMPL.get().unwrap() { match get_impl() {
RootImpl::KernelSU => kernelsu::uid_on_denylist(uid), RootImpl::KernelSU => kernelsu::uid_on_denylist(uid),
RootImpl::Magisk => magisk::uid_on_denylist(uid), RootImpl::Magisk => magisk::uid_on_denylist(uid),
_ => unreachable!(), _ => unreachable!(),