diff options
author | djm@openbsd.org <djm@openbsd.org> | 2018-01-23 05:17:04 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2018-01-23 16:40:28 +1100 |
commit | 7c77991f5de5d8475cbeb7cbb06d0c7d1611d7bb (patch) | |
tree | a91937cb7ce1bc2d7ae0e52160a5102199e16987 /sshconnect.c | |
parent | 9e9c4a7e57b96ab29fe6d7545ed09d2e5bddbdec (diff) |
upstream commit
try harder to preserve errno during
ssh_connect_direct() to make the final error message possibly accurate;
bz#2814, ok dtucker@
OpenBSD-Commit-ID: 57de882cb47381c319b04499fef845dd0c2b46ca
Diffstat (limited to 'sshconnect.c')
-rw-r--r-- | sshconnect.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/sshconnect.c b/sshconnect.c index 44977707..c25e192c 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.289 2017/12/06 05:06:21 djm Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.290 2018/01/23 05:17:04 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -416,7 +416,7 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop, int connection_attempts, int *timeout_ms, int want_keepalive, int needpriv) { int on = 1; - int sock = -1, attempt; + int oerrno, sock = -1, attempt; char ntop[NI_MAXHOST], strport[NI_MAXSERV]; struct addrinfo *ai; @@ -436,12 +436,16 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop, */ for (ai = aitop; ai; ai = ai->ai_next) { if (ai->ai_family != AF_INET && - ai->ai_family != AF_INET6) + ai->ai_family != AF_INET6) { + errno = EAFNOSUPPORT; continue; + } if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop, sizeof(ntop), strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) { + oerrno = errno; error("%s: getnameinfo failed", __func__); + errno = oerrno; continue; } debug("Connecting to %.200s [%.100s] port %s.", @@ -451,6 +455,7 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop, sock = ssh_create_socket(needpriv, ai); if (sock < 0) /* Any error is already output */ + errno = 0; continue; if (timeout_connect(sock, ai->ai_addr, ai->ai_addrlen, @@ -459,10 +464,12 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop, memcpy(hostaddr, ai->ai_addr, ai->ai_addrlen); break; } else { + oerrno = errno; debug("connect to address %s port %s: %s", ntop, strport, strerror(errno)); close(sock); sock = -1; + errno = oerrno; } } if (sock != -1) @@ -472,8 +479,8 @@ ssh_connect_direct(struct ssh *ssh, const char *host, struct addrinfo *aitop, /* Return failure if we didn't get a successful connection. */ if (sock == -1) { error("ssh: connect to host %s port %s: %s", - host, strport, strerror(errno)); - return (-1); + host, strport, errno == 0 ? "failure" : strerror(errno)); + return -1; } debug("Connection established."); |