summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-05-02 13:37:15 +0200
committerPatrick Steinhardt <ps@pks.im>2017-05-02 14:46:15 +0200
commit2ce2a48f2dfe6a92c0418f5c00e955039fdd0b96 (patch)
tree3b88b7a1c492f0c4e86030a1060e5a8223edaf1a /src
parent8c027351cb5a3bb16f279795f32027c92f61039a (diff)
downloadlibgit2-2ce2a48f2dfe6a92c0418f5c00e955039fdd0b96.tar.gz
transports: ssh: clean up after libssh2 on exit
After calling `libssh2_init`, we need to clean up after the library by executing `libssh2_exit` as soon as we exit. Register a shutdown handler to do so which simply calls `libssh2_exit`. This fixes several memory leaks.
Diffstat (limited to 'src')
-rw-r--r--src/global.c2
-rw-r--r--src/transports/ssh.c9
2 files changed, 10 insertions, 1 deletions
diff --git a/src/global.c b/src/global.c
index e2ad8fe71..afa57e1d6 100644
--- a/src/global.c
+++ b/src/global.c
@@ -22,7 +22,7 @@
git_mutex git__mwindow_mutex;
-#define MAX_SHUTDOWN_CB 8
+#define MAX_SHUTDOWN_CB 9
static git_global_shutdown_fn git__shutdown_callbacks[MAX_SHUTDOWN_CB];
static git_atomic git__n_shutdown_callbacks;
diff --git a/src/transports/ssh.c b/src/transports/ssh.c
index d195d58ad..4c55e3f2a 100644
--- a/src/transports/ssh.c
+++ b/src/transports/ssh.c
@@ -9,6 +9,7 @@
#include <libssh2.h>
#endif
+#include "global.h"
#include "git2.h"
#include "buffer.h"
#include "netops.h"
@@ -893,6 +894,13 @@ int git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *p
#endif
}
+#ifdef GIT_SSH
+static void shutdown_ssh(void)
+{
+ libssh2_exit();
+}
+#endif
+
int git_transport_ssh_global_init(void)
{
#ifdef GIT_SSH
@@ -901,6 +909,7 @@ int git_transport_ssh_global_init(void)
return -1;
}
+ git__on_shutdown(shutdown_ssh);
return 0;
#else