nready = select(maxfd + 1, fdsr, fdsw, NULL, NULL);
sudo_debug_printf(SUDO_DEBUG_DEBUG, "select returns %d", nready);
if (nready == -1) {
- if (errno == EINTR)
+ if (errno == EINTR || errno == ENOMEM)
continue;
- if (errno == EBADF) {
+ if (errno == EBADF || errno == EIO) {
/* One of the ttys must have gone away. */
goto do_tty_io;
}
- error(1, _("select failed"));
+ warning(_("select failed"));
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "select failure, terminating child");
+ schedule_signal(SIGKILL);
+ forward_signals(sv[0]);
+ break;
}
if (FD_ISSET(sv[0], fdsw)) {
forward_signals(sv[0]);
if (n <= 0) {
if (n == 0)
goto done;
- if (errno == EINTR)
+ if (errno == EINTR || errno == ENOMEM)
continue;
- error(1, "monitor: %s", _("select failed"));
+ warning("monitor: %s", _("select failed"));
+ break;
}
if (FD_ISSET(signal_pipe[0], fdsr)) {
if (nready <= 0) {
if (nready == 0)
break; /* all I/O flushed */
- if (errno == EINTR)
+ if (errno == EINTR || errno == ENOMEM)
continue;
- error(1, _("select failed"));
+ warning(_("select failed"));
}
- if (perform_io(fdsr, fdsw, NULL) != 0)
+ if (perform_io(fdsr, fdsw, NULL) != 0 || nready == -1)
break;
}
efree(fdsr);