Skip to content

Commit

Permalink
Report errors coherently when connection fails
Browse files Browse the repository at this point in the history
The cancellable connect trick wasn't properly reporting errors. Make it do so.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
  • Loading branch information
David Woodhouse authored and David Woodhouse committed Mar 26, 2015
1 parent 6978948 commit cda04d3
Showing 1 changed file with 25 additions and 6 deletions.
31 changes: 25 additions & 6 deletions ssl.c
Expand Up @@ -88,7 +88,12 @@ static int cancellable_connect(struct openconnect_info *vpninfo, int sockfd,

/* Check whether connect() succeeded or failed by using
getpeername(). See http://cr.yp.to/docs/connect.html */
return getpeername(sockfd, (void *)&peer, &peerlen);
if (getpeername(sockfd, (void *)&peer, &peerlen) && errno == ENOTCONN) {
char ch;
read(sockfd, &ch, 1);
return -1;
}
return 0;
}

/* checks whether the provided string is an IP or a hostname.
Expand Down Expand Up @@ -151,12 +156,12 @@ int connect_https_socket(struct openconnect_info *vpninfo)
reconn_err:
if (vpninfo->proxy) {
vpn_progress(vpninfo, PRG_ERR,
_("Failed to reconnect to proxy %s\n"),
vpninfo->proxy);
_("Failed to reconnect to proxy %s: %s\n"),
vpninfo->proxy, strerror(errno));
} else {
vpn_progress(vpninfo, PRG_ERR,
_("Failed to reconnect to host %s\n"),
vpninfo->hostname);
_("Failed to reconnect to host %s: %s\n"),
vpninfo->hostname, strerror(errno));
}
if (ssl_sock >= 0)
closesocket(ssl_sock);
Expand Down Expand Up @@ -269,7 +274,7 @@ int connect_https_socket(struct openconnect_info *vpninfo)
host[0] = 0;
if (!getnameinfo(rp->ai_addr, rp->ai_addrlen, host,
sizeof(host), NULL, 0, NI_NUMERICHOST))
vpn_progress(vpninfo, PRG_INFO, vpninfo->proxy_type ?
vpn_progress(vpninfo, PRG_DEBUG, vpninfo->proxy_type ?
_("Attempting to connect to proxy %s%s%s:%s\n") :
_("Attempting to connect to server %s%s%s:%s\n"),
rp->ai_family == AF_INET6 ? "[" : "",
Expand All @@ -285,6 +290,13 @@ int connect_https_socket(struct openconnect_info *vpninfo)
if (cancellable_connect(vpninfo, ssl_sock, rp->ai_addr, rp->ai_addrlen) >= 0) {
/* Store the peer address we actually used, so that DTLS can
use it again later */
if (host[0])
vpn_progress(vpninfo, PRG_INFO, _("Connected to %s%s%s:%s\n"),
rp->ai_family == AF_INET6 ? "[" : "",
host,
rp->ai_family == AF_INET6 ? "]" : "",
port);

free(vpninfo->peer_addr);
vpninfo->peer_addrlen = 0;
vpninfo->peer_addr = malloc(rp->ai_addrlen);
Expand Down Expand Up @@ -323,6 +335,13 @@ int connect_https_socket(struct openconnect_info *vpninfo)
}
break;
}
err = errno;
if (host[0])
vpn_progress(vpninfo, PRG_INFO, _("Failed to connect to %s%s%s:%s: %s\n"),
rp->ai_family == AF_INET6 ? "[" : "",
host,
rp->ai_family == AF_INET6 ? "]" : "",
port, strerror(err));
closesocket(ssl_sock);
ssl_sock = -1;

Expand Down

0 comments on commit cda04d3

Please sign in to comment.