diff options
author | Darren Tucker <dtucker@dtucker.net> | 2020-05-01 15:09:26 +1000 |
---|---|---|
committer | Darren Tucker <dtucker@dtucker.net> | 2020-05-01 15:09:26 +1000 |
commit | 6c6072ba8b079e6f5caa38b011a6f4570c14ed38 (patch) | |
tree | 44b3f0cc5a5d5cda88c3d8dd2ed063597743cfb8 /misc.c | |
parent | 90a0b434ed41f9c505662dba8782591818599cb3 (diff) |
See if SA_RESTART signals will interrupt select().
On some platforms (at least older HP-UXes such as 11.11, possibly others)
setting SA_RESTART on signal handers will cause it to not interrupt
select(), at least for calls that do not specify a timeout. Try to
detect this and if found, don't use SA_RESTART.
POSIX says "If SA_RESTART has been set for the interrupting signal, it
is implementation-dependent whether select() restarts or returns with
[EINTR]" so this behaviour is within spec.
Diffstat (limited to 'misc.c')
-rw-r--r-- | misc.c | 2 |
1 files changed, 2 insertions, 0 deletions
@@ -2258,8 +2258,10 @@ ssh_signal(int signum, sshsig_t handler) | |||
2258 | memset(&sa, 0, sizeof(sa)); | 2258 | memset(&sa, 0, sizeof(sa)); |
2259 | sa.sa_handler = handler; | 2259 | sa.sa_handler = handler; |
2260 | sigfillset(&sa.sa_mask); | 2260 | sigfillset(&sa.sa_mask); |
2261 | #if defined(SA_RESTART) && !defined(NO_SA_RESTART) | ||
2261 | if (signum != SIGALRM) | 2262 | if (signum != SIGALRM) |
2262 | sa.sa_flags = SA_RESTART; | 2263 | sa.sa_flags = SA_RESTART; |
2264 | #endif | ||
2263 | if (sigaction(signum, &sa, &osa) == -1) { | 2265 | if (sigaction(signum, &sa, &osa) == -1) { |
2264 | debug3("sigaction(%s): %s", strsignal(signum), strerror(errno)); | 2266 | debug3("sigaction(%s): %s", strsignal(signum), strerror(errno)); |
2265 | return SIG_ERR; | 2267 | return SIG_ERR; |