summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
authorDarren Tucker <dtucker@dtucker.net>2020-05-01 15:09:26 +1000
committerDarren Tucker <dtucker@dtucker.net>2020-05-01 15:09:26 +1000
commit6c6072ba8b079e6f5caa38b011a6f4570c14ed38 (patch)
tree44b3f0cc5a5d5cda88c3d8dd2ed063597743cfb8 /misc.c
parent90a0b434ed41f9c505662dba8782591818599cb3 (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.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/misc.c b/misc.c
index 506507226..554ceb0b1 100644
--- a/misc.c
+++ b/misc.c
@@ -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;