aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/init.c40
1 files changed, 16 insertions, 24 deletions
diff --git a/src/init.c b/src/init.c
index 0d45917c..49999cce 100644
--- a/src/init.c
+++ b/src/init.c
@@ -153,29 +153,29 @@ static int _ssh_finalize(unsigned destructor) {
if (!destructor) {
ssh_mutex_lock(&ssh_init_mutex);
- }
-
- if (_ssh_initialized == 1) {
- _ssh_initialized = 0;
- if (_ssh_init_ret < 0) {
+ if (_ssh_initialized > 1) {
+ _ssh_initialized--;
goto _ret;
}
- ssh_dh_finalize();
- ssh_crypto_finalize();
- ssh_socket_cleanup();
- /* It is important to finalize threading after CRYPTO because
- * it still depends on it */
- ssh_threads_finalize();
-
- }
- else {
- if (_ssh_initialized > 0) {
- _ssh_initialized--;
+ if (_ssh_initialized == 1) {
+ if (_ssh_init_ret < 0) {
+ goto _ret;
+ }
}
}
+ /* If the counter reaches zero or it is the destructor calling, finalize */
+ ssh_dh_finalize();
+ ssh_crypto_finalize();
+ ssh_socket_cleanup();
+ /* It is important to finalize threading after CRYPTO because
+ * it still depends on it */
+ ssh_threads_finalize();
+
+ _ssh_initialized = 0;
+
_ret:
if (!destructor) {
ssh_mutex_unlock(&ssh_init_mutex);
@@ -200,14 +200,6 @@ void libssh_destructor(void)
if (rc < 0) {
fprintf(stderr, "Error in libssh_destructor()\n");
}
-
- /* Detect if ssh_init() was called without matching ssh_finalize() */
- if (_ssh_initialized > 0) {
- fprintf(stderr,
- "Warning: ssh still initialized; probably ssh_init() "
- "was called more than once (init count: %d)\n",
- _ssh_initialized);
- }
}
/**