mirror of
git://git.musl-libc.org/musl
synced 2025-01-24 23:53:45 +00:00
269d193820
we wrongly defined a dummy SA_RESTORER flag on these archs, despite the kernel interface not actually having such a feature. on archs which lack SA_RESTORER, the kernel sigaction structure also lacks the restorer function pointer member, which means the signal mask appears at a different offset. the kernel was thereby interpreting the bits of the code address as part of the signal set to be masked while handling the signal. this patch removes the erroneous SA_RESTORER definitions from archs which do not have it, makes access to the member conditional on whether SA_RESTORER is defined for the arch, and removes the now-unused asm for the affected archs. because there are reportedly versions of qemu-user which also use the wrong ABI here, the old ksigaction struct size is preserved with an unused member at the end. this is harmless and mitigates the risk of such a bug turning into a buffer overflow onto the sigaction function's stack.
88 lines
1.9 KiB
C
88 lines
1.9 KiB
C
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|
|
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
|
|
#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
#define MINSIGSTKSZ 2048
|
|
#define SIGSTKSZ 8192
|
|
#endif
|
|
|
|
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
|
typedef unsigned long greg_t, gregset_t[38];
|
|
typedef struct sigcontext {
|
|
struct {
|
|
unsigned long r0, r1, r2, r3, r4, r5, r6, r7;
|
|
unsigned long r8, r9, r10, r11, r12, r13, r14, r15;
|
|
unsigned long r16, r17, r18, r19, r20, r21, r22, r23;
|
|
unsigned long r24, r25, r26, r27, r28, r29, r30, r31;
|
|
unsigned long pc, msr, ear, esr, fsr;
|
|
int pt_mode;
|
|
} regs;
|
|
unsigned long oldmask;
|
|
} mcontext_t;
|
|
#else
|
|
typedef struct {
|
|
unsigned long __regs[39];
|
|
} mcontext_t;
|
|
#endif
|
|
|
|
struct sigaltstack {
|
|
void *ss_sp;
|
|
int ss_flags;
|
|
size_t ss_size;
|
|
};
|
|
|
|
typedef struct __ucontext {
|
|
unsigned long uc_flags;
|
|
struct __ucontext *uc_link;
|
|
stack_t uc_stack;
|
|
mcontext_t uc_mcontext;
|
|
sigset_t uc_sigmask;
|
|
} ucontext_t;
|
|
|
|
#define SA_NOCLDSTOP 1
|
|
#define SA_NOCLDWAIT 2
|
|
#define SA_SIGINFO 4
|
|
#define SA_ONSTACK 0x08000000
|
|
#define SA_RESTART 0x10000000
|
|
#define SA_NODEFER 0x40000000
|
|
#define SA_RESETHAND 0x80000000
|
|
|
|
#endif
|
|
|
|
#define SIGHUP 1
|
|
#define SIGINT 2
|
|
#define SIGQUIT 3
|
|
#define SIGILL 4
|
|
#define SIGTRAP 5
|
|
#define SIGABRT 6
|
|
#define SIGIOT SIGABRT
|
|
#define SIGBUS 7
|
|
#define SIGFPE 8
|
|
#define SIGKILL 9
|
|
#define SIGUSR1 10
|
|
#define SIGSEGV 11
|
|
#define SIGUSR2 12
|
|
#define SIGPIPE 13
|
|
#define SIGALRM 14
|
|
#define SIGTERM 15
|
|
#define SIGSTKFLT 16
|
|
#define SIGCHLD 17
|
|
#define SIGCONT 18
|
|
#define SIGSTOP 19
|
|
#define SIGTSTP 20
|
|
#define SIGTTIN 21
|
|
#define SIGTTOU 22
|
|
#define SIGURG 23
|
|
#define SIGXCPU 24
|
|
#define SIGXFSZ 25
|
|
#define SIGVTALRM 26
|
|
#define SIGPROF 27
|
|
#define SIGWINCH 28
|
|
#define SIGIO 29
|
|
#define SIGPOLL 29
|
|
#define SIGPWR 30
|
|
#define SIGSYS 31
|
|
#define SIGUNUSED SIGSYS
|
|
|
|
#define _NSIG 65
|