[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