[klibc] [klibc:master] ia64: sigaction: Make signal updates atomic
klibc-bot for Ben Hutchings
ben at decadent.org.uk
Sat Aug 29 09:36:09 PDT 2020
Commit-ID: 69fb0c9b936dd59a7f7c9fab40f9206b80837b5b
Gitweb: http://git.kernel.org/?p=libs/klibc/klibc.git;a=commit;h=69fb0c9b936dd59a7f7c9fab40f9206b80837b5b
Author: Ben Hutchings <ben at decadent.org.uk>
AuthorDate: Fri, 28 Aug 2020 19:59:28 +0100
Committer: Ben Hutchings <ben at decadent.org.uk>
CommitDate: Sat, 29 Aug 2020 17:23:08 +0100
[klibc] ia64: sigaction: Make signal updates atomic
* If rt_sigaction() fails, undo the descriptor update
* Mask the signal while we're (potentially) updating its descriptor
Signed-off-by: Ben Hutchings <ben at decadent.org.uk>
---
usr/klibc/arch/ia64/sigaction.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/usr/klibc/arch/ia64/sigaction.c b/usr/klibc/arch/ia64/sigaction.c
index c1ea5fdd..3d2dbd44 100644
--- a/usr/klibc/arch/ia64/sigaction.c
+++ b/usr/klibc/arch/ia64/sigaction.c
@@ -21,6 +21,7 @@ __extern int ____rt_sigaction(int, const struct sigaction *, struct sigaction *,
int __rt_sigaction(int sig, struct sigaction *act,
struct sigaction *oact, size_t size)
{
+ sigset_t signal_mask, old_signal_mask;
uintptr_t old_entry;
int rv;
@@ -29,6 +30,13 @@ int __rt_sigaction(int sig, struct sigaction *act,
return -1;
}
+ /* Mask the signal to avoid races on access to its descriptor */
+ sigemptyset(&signal_mask);
+ sigaddset(&signal_mask, sig);
+ rv = sigprocmask(SIG_BLOCK, &signal_mask, &old_signal_mask);
+ if (rv)
+ return -1;
+
if (oact) {
old_entry = signal_descriptors[sig].entry;
}
@@ -41,6 +49,12 @@ int __rt_sigaction(int sig, struct sigaction *act,
rv = ____rt_sigaction(sig, act, oact, size);
+ if (rv)
+ signal_descriptors[sig].entry = old_entry;
+
+ /* Restore signal mask */
+ (void)sigprocmask(SIG_SETMASK, &old_signal_mask, NULL);
+
if (oact && oact->sa_handler != SIG_IGN &&
oact->sa_handler != SIG_DFL) {
oact->sa_handler = (__sighandler_t)old_entry;
More information about the klibc
mailing list