summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Lindstrom <mouring@eviladmin.org>2001-03-06 03:31:34 +0000
committerBen Lindstrom <mouring@eviladmin.org>2001-03-06 03:31:34 +0000
commitb3144e58e74ad9cc3c07da94264c3ccbfccb5cf7 (patch)
tree9ad479c3eef78443192fc92f20a281ac45cca8ed
parentbe6a5a6dfe14c516b0982e57bb95f022bf19cf46 (diff)
- deraadt@cvs.openbsd.org 2001/03/06 00:33:04
[authfd.c cli.c ssh-agent.c] EINTR/EAGAIN handling is required in more cases
-rw-r--r--ChangeLog5
-rw-r--r--authfd.c6
-rw-r--r--cli.c10
-rw-r--r--ssh-agent.c24
4 files changed, 34 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index a2a951fc..a306ec28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,6 +30,9 @@
- stevesk@cvs.openbsd.org 2001/03/05 17:58:22
[dh.c]
spelling
+ - deraadt@cvs.openbsd.org 2001/03/06 00:33:04
+ [authfd.c cli.c ssh-agent.c]
+ EINTR/EAGAIN handling is required in more cases
20010305
- (bal) CVS ID touch up on sshpty.[ch] and sshlogin.[ch]
@@ -4401,4 +4404,4 @@
- Wrote replacements for strlcpy and mkdtemp
- Released 1.0pre1
-$Id: ChangeLog,v 1.915 2001/03/06 01:13:06 mouring Exp $
+$Id: ChangeLog,v 1.916 2001/03/06 03:31:34 mouring Exp $
diff --git a/authfd.c b/authfd.c
index 76e91775..8613b9a5 100644
--- a/authfd.c
+++ b/authfd.c
@@ -35,7 +35,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: authfd.c,v 1.37 2001/03/04 17:42:27 millert Exp $");
+RCSID("$OpenBSD: authfd.c,v 1.38 2001/03/06 00:33:03 deraadt Exp $");
#include <openssl/evp.h>
@@ -120,6 +120,8 @@ ssh_request_reply(AuthenticationConnection *auth, Buffer *request, Buffer *reply
len = 4;
while (len > 0) {
l = read(auth->fd, buf + 4 - len, len);
+ if (l == -1 && (errno == EAGAIN || errno == EINTR))
+ continue;
if (l <= 0) {
error("Error reading response length from authentication socket.");
return 0;
@@ -139,6 +141,8 @@ ssh_request_reply(AuthenticationConnection *auth, Buffer *request, Buffer *reply
if (l > sizeof(buf))
l = sizeof(buf);
l = read(auth->fd, buf, l);
+ if (l == -1 && (errno == EAGAIN || errno == EINTR))
+ continue;
if (l <= 0) {
error("Error reading response from authentication socket.");
return 0;
diff --git a/cli.c b/cli.c
index 915b34b1..d0f0cf3f 100644
--- a/cli.c
+++ b/cli.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cli.c,v 1.10 2001/03/01 03:38:33 deraadt Exp $ */
+/* $OpenBSD: cli.c,v 1.11 2001/03/06 00:33:04 deraadt Exp $ */
/*
* Copyright (c) 2000 Markus Friedl. All rights reserved.
@@ -25,7 +25,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: cli.c,v 1.10 2001/03/01 03:38:33 deraadt Exp $");
+RCSID("$OpenBSD: cli.c,v 1.11 2001/03/06 00:33:04 deraadt Exp $");
#include "xmalloc.h"
#include "log.h"
@@ -134,12 +134,16 @@ cli_read(char* buf, int size, int echo)
{
char ch = 0;
int i = 0;
+ int n;
if (!echo)
cli_echo_disable();
while (ch != '\n') {
- if (read(cli_input, &ch, 1) != 1)
+ n = read(cli_input, &ch, 1);
+ if (n == -1 && (errno == EAGAIN || errno == EINTR))
+ continue;
+ if (n != 1)
break;
if (ch == '\n' || intr != 0)
break;
diff --git a/ssh-agent.c b/ssh-agent.c
index a558ecef..5a774d57 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ssh-agent.c,v 1.51 2001/03/02 18:54:31 deraadt Exp $ */
+/* $OpenBSD: ssh-agent.c,v 1.52 2001/03/06 00:33:04 deraadt Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -37,7 +37,7 @@
*/
#include "includes.h"
-RCSID("$OpenBSD: ssh-agent.c,v 1.51 2001/03/02 18:54:31 deraadt Exp $");
+RCSID("$OpenBSD: ssh-agent.c,v 1.52 2001/03/06 00:33:04 deraadt Exp $");
#include <openssl/evp.h>
#include <openssl/md5.h>
@@ -635,9 +635,15 @@ after_select(fd_set *readset, fd_set *writeset)
case AUTH_CONNECTION:
if (buffer_len(&sockets[i].output) > 0 &&
FD_ISSET(sockets[i].fd, writeset)) {
- len = write(sockets[i].fd,
- buffer_ptr(&sockets[i].output),
- buffer_len(&sockets[i].output));
+ do {
+ len = write(sockets[i].fd,
+ buffer_ptr(&sockets[i].output),
+ buffer_len(&sockets[i].output));
+ if (len == -1 && (errno == EAGAIN ||
+ errno == EINTR))
+ continue;
+ break;
+ } while (1);
if (len <= 0) {
shutdown(sockets[i].fd, SHUT_RDWR);
close(sockets[i].fd);
@@ -649,7 +655,13 @@ after_select(fd_set *readset, fd_set *writeset)
buffer_consume(&sockets[i].output, len);
}
if (FD_ISSET(sockets[i].fd, readset)) {
- len = read(sockets[i].fd, buf, sizeof(buf));
+ do {
+ len = read(sockets[i].fd, buf, sizeof(buf));
+ if (len == -1 && (errno == EAGAIN ||
+ errno == EINTR))
+ continue;
+ break;
+ } while (1);
if (len <= 0) {
shutdown(sockets[i].fd, SHUT_RDWR);
close(sockets[i].fd);