From f674b086388bf3cd86742d3dd5c834ad28db9a3a Mon Sep 17 00:00:00 2001 From: StackOverflowExcept1on <109800286+StackOverflowExcept1on@users.noreply.github.com> Date: Sun, 21 Jun 2026 13:48:44 +0300 Subject: [PATCH] fix(android/aarch64): use `libc::ucontext_t` from Android NDK --- src/unix/linux_like/android/b32/arm.rs | 2 +- .../linux_like/android/b64/aarch64/mod.rs | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/unix/linux_like/android/b32/arm.rs b/src/unix/linux_like/android/b32/arm.rs index 66375876e7760..fb88cd10af1bb 100644 --- a/src/unix/linux_like/android/b32/arm.rs +++ b/src/unix/linux_like/android/b32/arm.rs @@ -31,7 +31,7 @@ s! { pub struct __c_anonymous_uc_sigmask_with_padding { pub uc_sigmask: crate::sigset_t, - /* Android has a wrong (smaller) sigset_t on x86. */ + /* Android has a wrong (smaller) sigset_t on ARM. */ __padding_rt_sigset: Padding, } diff --git a/src/unix/linux_like/android/b64/aarch64/mod.rs b/src/unix/linux_like/android/b64/aarch64/mod.rs index 3cc6fc837693e..802499b6875ca 100644 --- a/src/unix/linux_like/android/b64/aarch64/mod.rs +++ b/src/unix/linux_like/android/b64/aarch64/mod.rs @@ -63,7 +63,10 @@ s! { pub uc_flags: c_ulong, pub uc_link: *mut ucontext_t, pub uc_stack: crate::stack_t, - pub uc_sigmask: crate::sigset_t, + pub uc_sigmask__c_anonymous_union: __c_anonymous_uc_sigmask, + /* The kernel adds extra padding after uc_sigmask to match + * glibc sigset_t on ARM64. */ + __padding: Padding<[c_char; 128 - size_of::()]>, pub uc_mcontext: mcontext_t, } @@ -85,12 +88,33 @@ s! { } s_no_extra_traits! { + pub union __c_anonymous_uc_sigmask { + uc_sigmask: crate::sigset_t, + uc_sigmask64: crate::sigset64_t, + } + #[repr(align(16))] pub struct max_align_t { priv_: [f32; 8], } } +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for __c_anonymous_uc_sigmask { + fn eq(&self, other: &__c_anonymous_uc_sigmask) -> bool { + unsafe { self.uc_sigmask == other.uc_sigmask } + } + } + impl Eq for __c_anonymous_uc_sigmask {} + impl hash::Hash for __c_anonymous_uc_sigmask { + fn hash(&self, state: &mut H) { + unsafe { self.uc_sigmask.hash(state) } + } + } + } +} + pub const O_DIRECT: c_int = 0x10000; pub const O_DIRECTORY: c_int = 0x4000; pub const O_NOFOLLOW: c_int = 0x8000;