about summary refs log tree commit diff
path: root/arch/or1k
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2023-02-09 11:52:44 -0500
committerRich Felker <dalias@aerifal.cx>2023-02-09 12:33:35 -0500
commit269d193820342dc109f39909d78fb30f4c978f76 (patch)
tree2acbae503e21dca93feb669b5d5a890ee915a797 /arch/or1k
parentea3b40a321e751e016948087ef23ae7b9e8e0150 (diff)
downloadmusl-269d193820342dc109f39909d78fb30f4c978f76.tar.gz
musl-269d193820342dc109f39909d78fb30f4c978f76.tar.xz
musl-269d193820342dc109f39909d78fb30f4c978f76.zip
fix wrong sigaction syscall ABI on mips*, or1k, microblaze, riscv64
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.
Diffstat (limited to 'arch/or1k')
-rw-r--r--arch/or1k/bits/signal.h1
1 files changed, 0 insertions, 1 deletions
diff --git a/arch/or1k/bits/signal.h b/arch/or1k/bits/signal.h
index be576d1d..c45be676 100644
--- a/arch/or1k/bits/signal.h
+++ b/arch/or1k/bits/signal.h
@@ -43,7 +43,6 @@ typedef struct __ucontext {
 #define SA_RESTART    0x10000000
 #define SA_NODEFER    0x40000000
 #define SA_RESETHAND  0x80000000
-#define SA_RESTORER   0x04000000
 
 #endif