From f9452513fcf92be881809006ce3c210805d5f2ad Mon Sep 17 00:00:00 2001 From: Ben Lindstrom Date: Thu, 15 Feb 2001 03:12:08 +0000 Subject: - deraadt@cvs.openbsd.org 2001/02/12 22:56:09 [clientloop.c packet.c ssh-keyscan.c] deal with EAGAIN/EINTR selects which were skipped --- ChangeLog | 5 ++++- clientloop.c | 11 ++++++++++- packet.c | 11 ++++++++--- ssh-keyscan.c | 7 +++++-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 14424b682..6ffe51708 100644 --- a/ChangeLog +++ b/ChangeLog @@ -20,6 +20,9 @@ ssh-keygen.c sshd.8] PermitRootLogin={yes,without-password,forced-commands-only,no} (before this change, root could login even if PermitRootLogin==no) + - deraadt@cvs.openbsd.org 2001/02/12 22:56:09 + [clientloop.c packet.c ssh-keyscan.c] + deal with EAGAIN/EINTR selects which were skipped 20010214 - (djm) Don't try to close PAM session or delete credentials if the @@ -3948,4 +3951,4 @@ - Wrote replacements for strlcpy and mkdtemp - Released 1.0pre1 -$Id: ChangeLog,v 1.764 2001/02/15 03:08:27 mouring Exp $ +$Id: ChangeLog,v 1.765 2001/02/15 03:12:08 mouring Exp $ diff --git a/clientloop.c b/clientloop.c index e892c1abd..547ccabfe 100644 --- a/clientloop.c +++ b/clientloop.c @@ -59,7 +59,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: clientloop.c,v 1.49 2001/02/08 19:30:51 itojun Exp $"); +RCSID("$OpenBSD: clientloop.c,v 1.51 2001/02/13 21:51:09 markus Exp $"); #include "ssh.h" #include "ssh1.h" @@ -406,6 +406,15 @@ client_wait_until_can_do_something(fd_set **readsetp, fd_set **writesetp, if (select((*maxfdp)+1, *readsetp, *writesetp, NULL, NULL) < 0) { char buf[100]; + + /* + * We have to clear the select masks, because we return. + * We have to return, because the mainloop checks for the flags + * set by the signal handlers. + */ + memset(*readsetp, 0, *maxfdp); + memset(*writesetp, 0, *maxfdp); + if (errno == EINTR) return; /* Note: we might still have data in the buffers. */ diff --git a/packet.c b/packet.c index 46e89bc0c..fb4314553 100644 --- a/packet.c +++ b/packet.c @@ -37,7 +37,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: packet.c,v 1.50 2001/02/11 12:59:25 markus Exp $"); +RCSID("$OpenBSD: packet.c,v 1.51 2001/02/12 22:56:09 deraadt Exp $"); #include "xmalloc.h" #include "buffer.h" @@ -688,7 +688,9 @@ packet_read(int *payload_len_ptr) FD_SET(connection_in, &set); /* Wait for some data to arrive. */ - select(connection_in + 1, &set, NULL, NULL, NULL); + while (select(connection_in + 1, &set, NULL, NULL, NULL) == -1 && + (errno == EAGAIN || errno == EINTR)) + ; /* Read data from the socket. */ len = read(connection_in, buf, sizeof(buf)); @@ -1195,9 +1197,12 @@ packet_write_wait() packet_write_poll(); while (packet_have_data_to_write()) { fd_set set; + FD_ZERO(&set); FD_SET(connection_out, &set); - select(connection_out + 1, NULL, &set, NULL, NULL); + while (select(connection_out + 1, NULL, &set, NULL, NULL) == -1 && + (errno == EAGAIN || errno == EINTR)) + ; packet_write_poll(); } } diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 834649fef..5cd368e93 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -8,7 +8,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh-keyscan.c,v 1.15 2001/02/09 09:04:59 itojun Exp $"); +RCSID("$OpenBSD: ssh-keyscan.c,v 1.16 2001/02/12 22:56:10 deraadt Exp $"); #if defined(HAVE_SYS_QUEUE_H) && !defined(HAVE_BOGUS_SYS_QUEUE_H) #include @@ -498,7 +498,10 @@ conloop(void) seltime.tv_sec = seltime.tv_usec = 0; r = e = read_wait; - select(maxfd, &r, NULL, &e, &seltime); + while (select(maxfd, &r, NULL, &e, &seltime) == -1 && + (errno == EAGAIN || errno == EINTR)) + ; + for (i = 0; i < maxfd; i++) if (FD_ISSET(i, &e)) { error("%s: exception!", fdcon[i].c_name); -- cgit v1.2.3