- (dtucker) [channels.c configure.ac serverloop.c] Bug #1102: Around AIX
4.3.3 ML3 or so, the AIX pty layer starting passing zero-length writes on the pty slave as zero-length reads on the pty master, which sshd interprets as the descriptor closing. Since most things don't do zero length writes this rarely matters, but occasionally it happens, and when it does the SSH pty session appears to hang, so we add a special case for this condition. ok djm@
This commit is contained in:
parent
3eb4834489
commit
9afe115f0a
|
@ -2,6 +2,13 @@
|
|||
- (dtucker) [README.platform configure.ac openbsd-compat/port-tun.c] Add
|
||||
tunnel support for Mac OS X/Darwin via a third-party tun driver. Patch
|
||||
from reyk@, tested by anil@
|
||||
- (dtucker) [channels.c configure.ac serverloop.c] Bug #1102: Around AIX
|
||||
4.3.3 ML3 or so, the AIX pty layer starting passing zero-length writes
|
||||
on the pty slave as zero-length reads on the pty master, which sshd
|
||||
interprets as the descriptor closing. Since most things don't do zero
|
||||
length writes this rarely matters, but occasionally it happens, and when
|
||||
it does the SSH pty session appears to hang, so we add a special case for
|
||||
this condition. ok djm@
|
||||
|
||||
20060613
|
||||
- (djm) [getput.h] This file has been replaced by functions in misc.c
|
||||
|
@ -4690,4 +4697,4 @@
|
|||
- (djm) Trim deprecated options from INSTALL. Mention UsePAM
|
||||
- (djm) Fix quote handling in sftp; Patch from admorten AT umich.edu
|
||||
|
||||
$Id: ChangeLog,v 1.4345 2006/06/23 11:05:12 dtucker Exp $
|
||||
$Id: ChangeLog,v 1.4346 2006/06/23 11:24:12 dtucker Exp $
|
||||
|
|
|
@ -1415,10 +1415,15 @@ channel_handle_rfd(Channel *c, fd_set *readset, fd_set *writeset)
|
|||
|
||||
if (c->rfd != -1 &&
|
||||
FD_ISSET(c->rfd, readset)) {
|
||||
errno = 0;
|
||||
len = read(c->rfd, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN))
|
||||
return 1;
|
||||
#ifndef PTY_ZEROREAD
|
||||
if (len <= 0) {
|
||||
#else
|
||||
if (len < 0 || (len == 0 && errno != 0)) {
|
||||
#endif
|
||||
debug2("channel %d: read<=0 rfd %d len %d",
|
||||
c->self, c->rfd, len);
|
||||
if (c->type != SSH_CHANNEL_OPEN) {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: configure.ac,v 1.340 2006/06/23 11:05:13 dtucker Exp $
|
||||
# $Id: configure.ac,v 1.341 2006/06/23 11:24:13 dtucker Exp $
|
||||
#
|
||||
# Copyright (c) 1999-2004 Damien Miller
|
||||
#
|
||||
|
@ -15,7 +15,7 @@
|
|||
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
AC_INIT(OpenSSH, Portable, openssh-unix-dev@mindrot.org)
|
||||
AC_REVISION($Revision: 1.340 $)
|
||||
AC_REVISION($Revision: 1.341 $)
|
||||
AC_CONFIG_SRCDIR([ssh.c])
|
||||
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
|
@ -190,6 +190,7 @@ case "$host" in
|
|||
supported by bsd-setproctitle.c])
|
||||
AC_DEFINE(SSHPAM_CHAUTHTOK_NEEDS_RUID, 1,
|
||||
[AIX 5.2 and 5.3 (and presumably newer) require this])
|
||||
AC_DEFINE(PTY_ZEROREAD, 1, [read(1) can return 0 for a non-closed fd])
|
||||
;;
|
||||
*-*-cygwin*)
|
||||
check_for_libcrypt_later=1
|
||||
|
|
10
serverloop.c
10
serverloop.c
|
@ -387,10 +387,15 @@ process_input(fd_set *readset)
|
|||
|
||||
/* Read and buffer any available stdout data from the program. */
|
||||
if (!fdout_eof && FD_ISSET(fdout, readset)) {
|
||||
errno = 0;
|
||||
len = read(fdout, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN)) {
|
||||
/* do nothing */
|
||||
#ifdef PTY_ZEROREAD
|
||||
} else if (len <= 0) {
|
||||
#else
|
||||
} else if (len < 0 || (len == 0 && errno != 0)) {
|
||||
#endif
|
||||
fdout_eof = 1;
|
||||
} else {
|
||||
buffer_append(&stdout_buffer, buf, len);
|
||||
|
@ -399,10 +404,15 @@ process_input(fd_set *readset)
|
|||
}
|
||||
/* Read and buffer any available stderr data from the program. */
|
||||
if (!fderr_eof && FD_ISSET(fderr, readset)) {
|
||||
errno = 0;
|
||||
len = read(fderr, buf, sizeof(buf));
|
||||
if (len < 0 && (errno == EINTR || errno == EAGAIN)) {
|
||||
/* do nothing */
|
||||
#ifdef PTY_ZEROREAD
|
||||
} else if (len <= 0) {
|
||||
#else
|
||||
} else if (len < 0 || (len == 0 && errno != 0)) {
|
||||
#endif
|
||||
fderr_eof = 1;
|
||||
} else {
|
||||
buffer_append(&stderr_buffer, buf, len);
|
||||
|
|
Loading…
Reference in New Issue