=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/kex.c,v retrieving revision 1.157 retrieving revision 1.158 diff -u -r1.157 -r1.158 --- src/usr.bin/ssh/kex.c 2020/02/26 13:40:09 1.157 +++ src/usr.bin/ssh/kex.c 2020/03/13 04:01:56 1.158 @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.c,v 1.157 2020/02/26 13:40:09 jsg Exp $ */ +/* $OpenBSD: kex.c,v 1.158 2020/03/13 04:01:56 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -1152,7 +1152,7 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms, const char *version_addendum) { - int remote_major, remote_minor, mismatch; + int remote_major, remote_minor, mismatch, oerrno = 0; size_t len, i, n; int r, expect_nl; u_char c; @@ -1171,6 +1171,7 @@ PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION, version_addendum == NULL ? "" : " ", version_addendum == NULL ? "" : version_addendum)) != 0) { + oerrno = errno; error("%s: sshbuf_putf: %s", __func__, ssh_err(r)); goto out; } @@ -1178,11 +1179,13 @@ if (atomicio(vwrite, ssh_packet_get_connection_out(ssh), sshbuf_mutable_ptr(our_version), sshbuf_len(our_version)) != sshbuf_len(our_version)) { - error("%s: write: %.100s", __func__, strerror(errno)); + oerrno = errno; + debug("%s: write: %.100s", __func__, strerror(errno)); r = SSH_ERR_SYSTEM_ERROR; goto out; } if ((r = sshbuf_consume_end(our_version, 2)) != 0) { /* trim \r\n */ + oerrno = errno; error("%s: sshbuf_consume_end: %s", __func__, ssh_err(r)); goto out; } @@ -1218,6 +1221,7 @@ r = SSH_ERR_CONN_TIMEOUT; goto out; } else if (r == -1) { + oerrno = errno; error("%s: %s", __func__, strerror(errno)); r = SSH_ERR_SYSTEM_ERROR; @@ -1233,6 +1237,7 @@ r = SSH_ERR_CONN_CLOSED; goto out; } else if (len != 1) { + oerrno = errno; error("%s: read: %.100s", __func__, strerror(errno)); r = SSH_ERR_SYSTEM_ERROR; @@ -1250,6 +1255,7 @@ goto invalid; } if ((r = sshbuf_put_u8(peer_version, c)) != 0) { + oerrno = errno; error("%s: sshbuf_put: %s", __func__, ssh_err(r)); goto out; @@ -1350,6 +1356,8 @@ free(our_version_string); free(peer_version_string); free(remote_version); + if (r == SSH_ERR_SYSTEM_ERROR) + errno = oerrno; return r; }