- (djm) [atomicio.c channels.c clientloop.c defines.h includes.h]
[packet.c scp.c serverloop.c sftp-client.c ssh-agent.c ssh-keyscan.c] [sshd.c] Explicitly handle EWOULDBLOCK wherever we handle EAGAIN, on some platforms (HP nonstop) it is a distinct errno; bz#1467 reported by sconeu AT yahoo.com; ok dtucker@
This commit is contained in:
parent
b01bac109b
commit
d8968adb5f
|
@ -30,7 +30,12 @@
|
|||
explicitly disable conch options that could interfere with the test
|
||||
- (dtucker) [sftp-server.c] Bug #1447: fall back to racy rename if link
|
||||
returns EXDEV. Patch from Mike Garrison, ok djm@
|
||||
h
|
||||
- (djm) [atomicio.c channels.c clientloop.c defines.h includes.h]
|
||||
[packet.c scp.c serverloop.c sftp-client.c ssh-agent.c ssh-keyscan.c]
|
||||
[sshd.c] Explicitly handle EWOULDBLOCK wherever we handle EAGAIN, on
|
||||
some platforms (HP nonstop) it is a distinct errno;
|
||||
bz#1467 reported by sconeu AT yahoo.com; ok dtucker@
|
||||
|
||||
20080702
|
||||
- (dtucker) OpenBSD CVS Sync
|
||||
- djm@cvs.openbsd.org 2008/06/30 08:05:59
|
||||
|
@ -4565,4 +4570,4 @@ h
|
|||
OpenServer 6 and add osr5bigcrypt support so when someone migrates
|
||||
passwords between UnixWare and OpenServer they will still work. OK dtucker@
|
||||
|
||||
$Id: ChangeLog,v 1.5057 2008/07/04 07:11:30 dtucker Exp $
|
||||
$Id: ChangeLog,v 1.5058 2008/07/04 13:10:49 djm Exp $
|
||||
|
|
|
@ -63,11 +63,7 @@ atomicio(ssize_t (*f) (int, void *, size_t), int fd, void *_s, size_t n)
|
|||
case -1:
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
#ifdef EWOULDBLOCK
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
#else
|
||||
if (errno == EAGAIN) {
|
||||
#endif
|
||||
(void)poll(&pfd, 1, -1);
|
||||
continue;
|
||||
}
|
||||
|
@ -109,11 +105,7 @@ atomiciov(ssize_t (*f) (int, const struct iovec *, int), int fd,
|
|||
case -1:
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
#ifdef EWOULDBLOCK
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
#else
|
||||
if (errno == EAGAIN) {
|
||||
#endif
|
||||
(void)poll(&pfd, 1, -1);
|
||||
continue;
|
||||
}
|
||||
|
|
19
channels.c
19
channels.c
|
@ -1494,7 +1494,8 @@ channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
if (c->rfd != -1 && (force || FD_ISSET(c->rfd, readset))) {
|
||||
errno = 0;
|
||||
len = read(c->rfd, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR || (errno == EAGAIN && !force)))
|
||||
if (len < 0 && (errno == EINTR ||
|
||||
((errno == EAGAIN || errno == EWOULDBLOCK) && !force)))
|
||||
return 1;
|
||||
#ifndef PTY_ZEROREAD
|
||||
if (len <= 0) {
|
||||
|
@ -1565,7 +1566,8 @@ channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
c->local_consumed += dlen + 4;
|
||||
len = write(c->wfd, buf, dlen);
|
||||
xfree(data);
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK))
|
||||
return 1;
|
||||
if (len <= 0) {
|
||||
if (c->type != SSH_CHANNEL_OPEN)
|
||||
|
@ -1583,7 +1585,8 @@ channel_handle_wfd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
#endif
|
||||
|
||||
len = write(c->wfd, buf, dlen);
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
if (len < 0 &&
|
||||
(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
|
||||
return 1;
|
||||
if (len <= 0) {
|
||||
if (c->type != SSH_CHANNEL_OPEN) {
|
||||
|
@ -1635,7 +1638,8 @@ channel_handle_efd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
buffer_len(&c->extended));
|
||||
debug2("channel %d: written %d to efd %d",
|
||||
c->self, len, c->efd);
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK))
|
||||
return 1;
|
||||
if (len <= 0) {
|
||||
debug2("channel %d: closing write-efd %d",
|
||||
|
@ -1650,8 +1654,8 @@ channel_handle_efd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
len = read(c->efd, buf, sizeof(buf));
|
||||
debug2("channel %d: read %d from efd %d",
|
||||
c->self, len, c->efd);
|
||||
if (len < 0 && (errno == EINTR ||
|
||||
(errno == EAGAIN && !c->detach_close)))
|
||||
if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK) && !c->detach_close)))
|
||||
return 1;
|
||||
if (len <= 0) {
|
||||
debug2("channel %d: closing read-efd %d",
|
||||
|
@ -1675,7 +1679,8 @@ channel_handle_ctl(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
/* Monitor control fd to detect if the slave client exits */
|
||||
if (c->ctl_fd != -1 && FD_ISSET(c->ctl_fd, readset)) {
|
||||
len = read(c->ctl_fd, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
if (len < 0 &&
|
||||
(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK))
|
||||
return 1;
|
||||
if (len <= 0) {
|
||||
debug2("channel %d: ctl read<=0", c->self);
|
||||
|
|
12
clientloop.c
12
clientloop.c
|
@ -663,7 +663,8 @@ client_process_net_input(fd_set *readset)
|
|||
* There is a kernel bug on Solaris that causes select to
|
||||
* sometimes wake up even though there is no data available.
|
||||
*/
|
||||
if (len < 0 && (errno == EAGAIN || errno == EINTR))
|
||||
if (len < 0 &&
|
||||
(errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
|
||||
len = 0;
|
||||
|
||||
if (len < 0) {
|
||||
|
@ -1129,7 +1130,8 @@ client_process_input(fd_set *readset)
|
|||
if (FD_ISSET(fileno(stdin), readset)) {
|
||||
/* Read as much as possible. */
|
||||
len = read(fileno(stdin), buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EAGAIN || errno == EINTR))
|
||||
if (len < 0 &&
|
||||
(errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
|
||||
return; /* we'll try again later */
|
||||
if (len <= 0) {
|
||||
/*
|
||||
|
@ -1186,7 +1188,8 @@ client_process_output(fd_set *writeset)
|
|||
len = write(fileno(stdout), buffer_ptr(&stdout_buffer),
|
||||
buffer_len(&stdout_buffer));
|
||||
if (len <= 0) {
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
if (errno == EINTR || errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK)
|
||||
len = 0;
|
||||
else {
|
||||
/*
|
||||
|
@ -1210,7 +1213,8 @@ client_process_output(fd_set *writeset)
|
|||
len = write(fileno(stderr), buffer_ptr(&stderr_buffer),
|
||||
buffer_len(&stderr_buffer));
|
||||
if (len <= 0) {
|
||||
if (errno == EINTR || errno == EAGAIN)
|
||||
if (errno == EINTR || errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK)
|
||||
len = 0;
|
||||
else {
|
||||
/*
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#ifndef _DEFINES_H
|
||||
#define _DEFINES_H
|
||||
|
||||
/* $Id: defines.h,v 1.150 2008/06/13 00:28:57 dtucker Exp $ */
|
||||
/* $Id: defines.h,v 1.151 2008/07/04 13:10:49 djm Exp $ */
|
||||
|
||||
|
||||
/* Constants */
|
||||
|
@ -734,4 +734,8 @@ struct winsize {
|
|||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef EWOULDBLOCK
|
||||
# define EWOULDBLOCK EAGAIN
|
||||
#endif
|
||||
|
||||
#endif /* _DEFINES_H */
|
||||
|
|
|
@ -149,6 +149,8 @@
|
|||
# include <sys/syslog.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
/*
|
||||
* On HP-UX 11.11, shadow.h and prot.h provide conflicting declarations
|
||||
* of getspnam when _INCLUDE__STDC__ is defined, so we unset it here.
|
||||
|
|
8
packet.c
8
packet.c
|
@ -956,7 +956,8 @@ packet_read_seqnr(u_int32_t *seqnr_p)
|
|||
if ((ret = select(connection_in + 1, setp, NULL,
|
||||
NULL, timeoutp)) >= 0)
|
||||
break;
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
if (errno != EAGAIN && errno != EINTR &&
|
||||
errno != EWOULDBLOCK)
|
||||
break;
|
||||
if (packet_timeout_ms == -1)
|
||||
continue;
|
||||
|
@ -1475,7 +1476,7 @@ packet_write_poll(void)
|
|||
if (len > 0) {
|
||||
len = write(connection_out, buffer_ptr(&output), len);
|
||||
if (len <= 0) {
|
||||
if (errno == EAGAIN)
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
||||
return;
|
||||
else
|
||||
fatal("Write failed: %.100s", strerror(errno));
|
||||
|
@ -1516,7 +1517,8 @@ packet_write_wait(void)
|
|||
if ((ret = select(connection_out + 1, NULL, setp,
|
||||
NULL, timeoutp)) >= 0)
|
||||
break;
|
||||
if (errno != EAGAIN && errno != EINTR)
|
||||
if (errno != EAGAIN && errno != EINTR &&
|
||||
errno != EWOULDBLOCK)
|
||||
break;
|
||||
if (packet_timeout_ms == -1)
|
||||
continue;
|
||||
|
|
2
scp.c
2
scp.c
|
@ -474,7 +474,7 @@ scpio(ssize_t (*f)(int, void *, size_t), int fd, void *_p, size_t l, off_t *c)
|
|||
if (r < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
if (errno == EAGAIN) {
|
||||
if (errno == EAGAIN || errno == EWOULDBLOCK) {
|
||||
(void)poll(&pfd, 1, -1); /* Ignore errors */
|
||||
continue;
|
||||
}
|
||||
|
|
14
serverloop.c
14
serverloop.c
|
@ -400,7 +400,8 @@ process_input(fd_set *readset)
|
|||
return;
|
||||
cleanup_exit(255);
|
||||
} else if (len < 0) {
|
||||
if (errno != EINTR && errno != EAGAIN) {
|
||||
if (errno != EINTR && errno != EAGAIN &&
|
||||
errno != EWOULDBLOCK) {
|
||||
verbose("Read error from remote host "
|
||||
"%.100s: %.100s",
|
||||
get_remote_ipaddr(), strerror(errno));
|
||||
|
@ -418,8 +419,8 @@ process_input(fd_set *readset)
|
|||
if (!fdout_eof && FD_ISSET(fdout, readset)) {
|
||||
errno = 0;
|
||||
len = read(fdout, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR ||
|
||||
(errno == EAGAIN && !child_terminated))) {
|
||||
if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK) && !child_terminated))) {
|
||||
/* do nothing */
|
||||
#ifndef PTY_ZEROREAD
|
||||
} else if (len <= 0) {
|
||||
|
@ -437,8 +438,8 @@ process_input(fd_set *readset)
|
|||
if (!fderr_eof && FD_ISSET(fderr, readset)) {
|
||||
errno = 0;
|
||||
len = read(fderr, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR ||
|
||||
(errno == EAGAIN && !child_terminated))) {
|
||||
if (len < 0 && (errno == EINTR || ((errno == EAGAIN ||
|
||||
errno == EWOULDBLOCK) && !child_terminated))) {
|
||||
/* do nothing */
|
||||
#ifndef PTY_ZEROREAD
|
||||
} else if (len <= 0) {
|
||||
|
@ -469,7 +470,8 @@ process_output(fd_set *writeset)
|
|||
data = buffer_ptr(&stdin_buffer);
|
||||
dlen = buffer_len(&stdin_buffer);
|
||||
len = write(fdin, data, dlen);
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN)) {
|
||||
if (len < 0 &&
|
||||
(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK)) {
|
||||
/* do nothing */
|
||||
} else if (len <= 0) {
|
||||
if (fdin != fdout)
|
||||
|
|
|
@ -1223,7 +1223,8 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
|
|||
len = 0;
|
||||
else do
|
||||
len = read(local_fd, data, conn->transfer_buflen);
|
||||
while ((len == -1) && (errno == EINTR || errno == EAGAIN));
|
||||
while ((len == -1) &&
|
||||
(errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
|
||||
|
||||
if (len == -1)
|
||||
fatal("Couldn't read from \"%s\": %s", local_path,
|
||||
|
|
|
@ -961,7 +961,8 @@ after_select(fd_set *readset, fd_set *writeset)
|
|||
buffer_ptr(&sockets[i].output),
|
||||
buffer_len(&sockets[i].output));
|
||||
if (len == -1 && (errno == EAGAIN ||
|
||||
errno == EINTR))
|
||||
errno == EINTR ||
|
||||
errno == EWOULDBLOCK))
|
||||
continue;
|
||||
break;
|
||||
} while (1);
|
||||
|
@ -975,7 +976,8 @@ after_select(fd_set *readset, fd_set *writeset)
|
|||
do {
|
||||
len = read(sockets[i].fd, buf, sizeof(buf));
|
||||
if (len == -1 && (errno == EAGAIN ||
|
||||
errno == EINTR))
|
||||
errno == EINTR ||
|
||||
errno == EWOULDBLOCK))
|
||||
continue;
|
||||
break;
|
||||
} while (1);
|
||||
|
|
|
@ -656,7 +656,7 @@ conloop(void)
|
|||
memcpy(e, read_wait, read_wait_nfdset * sizeof(fd_mask));
|
||||
|
||||
while (select(maxfd, r, NULL, e, &seltime) == -1 &&
|
||||
(errno == EAGAIN || errno == EINTR))
|
||||
(errno == EAGAIN || errno == EINTR || errno == EWOULDBLOCK))
|
||||
;
|
||||
|
||||
for (i = 0; i < maxfd; i++) {
|
||||
|
|
3
sshd.c
3
sshd.c
|
@ -1096,7 +1096,8 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s)
|
|||
*newsock = accept(listen_socks[i],
|
||||
(struct sockaddr *)&from, &fromlen);
|
||||
if (*newsock < 0) {
|
||||
if (errno != EINTR && errno != EWOULDBLOCK)
|
||||
if (errno != EINTR && errno != EAGAIN &&
|
||||
errno != EWOULDBLOCK)
|
||||
error("accept: %.100s", strerror(errno));
|
||||
continue;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue