Commit 146a96de82aebeca5e9b5bfe7fc69456f2bf2d0e

Carlos Martín Nieto 2015-09-30T09:41:25

openssl: don't try to teardown an unconnected SSL context SSL_shutdown() does not like it when we pass an unitialized ssl context to it. This means that when we fail to connect to a host, we hide the error message saying so with OpenSSL's indecipherable error message.

diff --git a/src/openssl_stream.c b/src/openssl_stream.c
index 8ff53d4..54dd761 100644
--- a/src/openssl_stream.c
+++ b/src/openssl_stream.c
@@ -302,6 +302,7 @@ cert_fail_name:
 typedef struct {
 	git_stream parent;
 	git_stream *io;
+	bool connected;
 	char *host;
 	SSL *ssl;
 	git_cert_x509 cert_info;
@@ -318,6 +319,8 @@ int openssl_connect(git_stream *stream)
 	if ((ret = git_stream_connect(st->io)) < 0)
 		return ret;
 
+	st->connected = true;
+
 	bio = BIO_new(&git_stream_bio_method);
 	GITERR_CHECK_ALLOC(bio);
 	bio->ptr = st->io;
@@ -406,9 +409,11 @@ int openssl_close(git_stream *stream)
 	openssl_stream *st = (openssl_stream *) stream;
 	int ret;
 
-	if ((ret = ssl_teardown(st->ssl)) < 0)
+	if (st->connected && (ret = ssl_teardown(st->ssl)) < 0)
 		return -1;
 
+	st->connected = false;
+
 	return git_stream_close(st->io);
 }