diff options
| author | Carlos Martín Nieto <carlos@cmartin.tk> | 2012-05-03 14:07:55 +0200 |
|---|---|---|
| committer | Carlos Martín Nieto <carlos@cmartin.tk> | 2012-05-19 17:50:52 +0200 |
| commit | 89460f3f57b6efa906263a19b982f8a7859b15c9 (patch) | |
| tree | 2994f0d454f2fb8c5979b85185dc22d67b5ec53c /src/netops.c | |
| parent | a6f24a5b3a8dcb9ab7f84679d658e66f374b88d6 (diff) | |
| download | libgit2-89460f3f57b6efa906263a19b982f8a7859b15c9.tar.gz | |
ssl: teardown the connection on close
This should help us free some resources, though the libraries do keep
some buffers allocated regardless.
Diffstat (limited to 'src/netops.c')
| -rw-r--r-- | src/netops.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/src/netops.c b/src/netops.c index 67a361ea9..7ee720d67 100644 --- a/src/netops.c +++ b/src/netops.c @@ -166,9 +166,35 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons) buf->offset -= cons; } +int gitno_ssl_teardown(git_transport *t) +{ + int ret = ret; + + if (!t->encrypt) + return 0; + #ifdef GIT_GNUTLS + gnutls_deinit(t->ssl.session); + gnutls_certificate_free_credentials(t->ssl.cred); + gnutls_global_deinit(); +#elif defined(GIT_OPENSSL) + + do { + ret = SSL_shutdown(t->ssl.ssl); + } while (ret == 0); + if (ret < 0) + return ssl_set_error(&t->ssl, ret); + + SSL_free(t->ssl.ssl); + SSL_CTX_free(t->ssl.ctx); +#endif + return 0; +} + + static int ssl_setup(git_transport *t) { +#ifdef GIT_GNUTLS int ret; if ((ret = gnutls_global_init()) < 0) @@ -199,11 +225,9 @@ static int ssl_setup(git_transport *t) on_error: gnutls_deinit(t->ssl.session); + gnutls_global_deinit(); return -1; -} #elif defined(GIT_OPENSSL) -static int ssl_setup(git_transport *t) -{ int ret; SSL_library_init(); @@ -225,9 +249,11 @@ static int ssl_setup(git_transport *t) return ssl_set_error(&t->ssl, ret); return 0; -} +#else + GIT_UNUSED(t); + return 0; #endif - +} int gitno_connect(git_transport *t, const char *host, const char *port) { struct addrinfo *info = NULL, *p; @@ -268,10 +294,8 @@ int gitno_connect(git_transport *t, const char *host, const char *port) t->socket = s; freeaddrinfo(info); -#ifdef GIT_SSL if (t->encrypt && ssl_setup(t) < 0) return -1; -#endif return 0; } |
