summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
authordtucker@openbsd.org <dtucker@openbsd.org>2020-01-23 07:10:22 +0000
committerDarren Tucker <dtucker@dtucker.net>2020-01-23 18:51:25 +1100
commit3bf2a6ac791d64046a537335a0f1d5e43579c5ad (patch)
tree76fcc0f1be306541c074be4aed3aca66023f0962 /misc.c
parente027c044c796f3a01081a91bee55741204283f28 (diff)
upstream: Replace all calls to signal(2) with a wrapper around
sigaction(2). This wrapper blocks all other signals during the handler preventing races between handlers, and sets SA_RESTART which should reduce the potential for short read/write operations. OpenBSD-Commit-ID: 5e047663fd77a40d7b07bdabe68529df51fd2519
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/misc.c b/misc.c
index 5204c1e9f..f25b8cf5c 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: misc.c,v 1.143 2019/11/22 06:50:30 dtucker Exp $ */ 1/* $OpenBSD: misc.c,v 1.144 2020/01/23 07:10:22 dtucker Exp $ */
2/* 2/*
3 * Copyright (c) 2000 Markus Friedl. All rights reserved. 3 * Copyright (c) 2000 Markus Friedl. All rights reserved.
4 * Copyright (c) 2005,2006 Damien Miller. All rights reserved. 4 * Copyright (c) 2005,2006 Damien Miller. All rights reserved.
@@ -2221,3 +2221,20 @@ opt_match(const char **opts, const char *term)
2221 return 0; 2221 return 0;
2222} 2222}
2223 2223
2224sshsig_t
2225ssh_signal(int signum, sshsig_t handler)
2226{
2227 struct sigaction sa, osa;
2228
2229 /* mask all other signals while in handler */
2230 bzero(&sa, sizeof(sa));
2231 sa.sa_handler = handler;
2232 sigfillset(&sa.sa_mask);
2233 if (signum != SIGALRM)
2234 sa.sa_flags = SA_RESTART;
2235 if (sigaction(signum, &sa, &osa) == -1) {
2236 debug3("sigaction(%s): %s", strsignal(signum), strerror(errno));
2237 return SIG_ERR;
2238 }
2239 return osa.sa_handler;
2240}