diff options
author | dtucker@openbsd.org <dtucker@openbsd.org> | 2020-01-23 07:10:22 +0000 |
---|---|---|
committer | Darren Tucker <dtucker@dtucker.net> | 2020-01-23 18:51:25 +1100 |
commit | 3bf2a6ac791d64046a537335a0f1d5e43579c5ad (patch) | |
tree | 76fcc0f1be306541c074be4aed3aca66023f0962 /misc.c | |
parent | e027c044c796f3a01081a91bee55741204283f28 (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.c | 19 |
1 files changed, 18 insertions, 1 deletions
@@ -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 | ||
2224 | sshsig_t | ||
2225 | ssh_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 | } | ||