Handle EINTR from write(2) when writing to pipes and socket pairs.
This commit is contained in:
15
src/exec.c
15
src/exec.c
@@ -877,7 +877,10 @@ handler(int s, siginfo_t *info, void *context)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
void
|
||||
@@ -889,7 +892,10 @@ handler(int s)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -911,7 +917,10 @@ handler_user_only(int s, siginfo_t *info, void *context)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* SA_SIGINFO */
|
||||
|
@@ -148,7 +148,10 @@ mon_handler(int s, siginfo_t *info, void *context)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void
|
||||
@@ -160,7 +163,10 @@ mon_handler(int s)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1281,7 +1287,10 @@ exec_monitor(struct command_details *details, int backchannel)
|
||||
|
||||
/* setup tty and exec command */
|
||||
exec_pty(details, &cstat, errpipe[1]);
|
||||
ignore_result(write(errpipe[1], &cstat, sizeof(cstat)));
|
||||
while (write(errpipe[1], &cstat, sizeof(cstat)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
_exit(1);
|
||||
}
|
||||
close(errpipe[1]);
|
||||
|
@@ -102,7 +102,10 @@ sudo_handler(int signo)
|
||||
* The pipe is non-blocking, if we overflow the kernel's pipe
|
||||
* buffer we drop the signal. This is not a problem in practice.
|
||||
*/
|
||||
ignore_result(write(signal_pipe[1], &signo, sizeof(signo)));
|
||||
while (write(signal_pipe[1], &signo, sizeof(signo)) == -1) {
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user