Commit fe6b51ae by Carlos Martín Nieto

ssl: separate locking init from general init

Extract the lock-setting functions into their own, as we cannot assume
that it's ok for us to set this unconditionally.
parent e0836577
...@@ -44,6 +44,22 @@ GIT_EXTERN(int) git_threads_init(void); ...@@ -44,6 +44,22 @@ GIT_EXTERN(int) git_threads_init(void);
*/ */
GIT_EXTERN(void) git_threads_shutdown(void); GIT_EXTERN(void) git_threads_shutdown(void);
/**
* Initialize the OpenSSL locks
*
* OpenSSL requires the application to determine how it performs
* locking. This is a convenience function which libgit2 provides for
* allocating and initializing the locks as well as setting the
* locking function to use the system's native locking functions.
*
* The locking function will be cleared and the memory will be freed
* when you call git_threads_sutdown().
*
* @return 0 on success, -1 if there are errors or if libgit2 was not
* built with OpenSSL and threading support.
*/
GIT_EXTERN(int) git_openssl_set_locking(void);
/** @} */ /** @} */
GIT_END_DECL GIT_END_DECL
#endif #endif
......
...@@ -64,7 +64,7 @@ void openssl_locking_function(int mode, int n, const char *file, int line) ...@@ -64,7 +64,7 @@ void openssl_locking_function(int mode, int n, const char *file, int line)
} }
} }
static void shutdown_ssl(void) static void shutdown_ssl_locking(void)
{ {
CRYPTO_set_locking_callback(NULL); CRYPTO_set_locking_callback(NULL);
git__free(openssl_locks); git__free(openssl_locks);
...@@ -96,30 +96,35 @@ static void init_ssl(void) ...@@ -96,30 +96,35 @@ static void init_ssl(void)
SSL_CTX_free(git__ssl_ctx); SSL_CTX_free(git__ssl_ctx);
git__ssl_ctx = NULL; git__ssl_ctx = NULL;
} }
#endif
}
int git_openssl_set_locking(void)
{
#ifdef GIT_SSL
# ifdef GIT_THREADS # ifdef GIT_THREADS
{
int num_locks, i; int num_locks, i;
num_locks = CRYPTO_num_locks(); num_locks = CRYPTO_num_locks();
openssl_locks = git__calloc(num_locks, sizeof(git_mutex)); openssl_locks = git__calloc(num_locks, sizeof(git_mutex));
if (openssl_locks == NULL) { GITERR_CHECK_ALLOC(openssl_locks);
SSL_CTX_free(git__ssl_ctx);
git__ssl_ctx = NULL;
}
for (i = 0; i < num_locks; i++) { for (i = 0; i < num_locks; i++) {
if (git_mutex_init(&openssl_locks[i]) != 0) { if (git_mutex_init(&openssl_locks[i]) != 0) {
SSL_CTX_free(git__ssl_ctx); giterr_set(GITERR_SSL, "failed to initialize openssl locks");
git__ssl_ctx = NULL; return -1;
} }
} }
CRYPTO_set_locking_callback(openssl_locking_function); CRYPTO_set_locking_callback(openssl_locking_function);
} git__on_shutdown(shutdown_ssl_locking);
return 0;
git__on_shutdown(shutdown_ssl); # else
giterr_set(GITERR_THREAD, "libgit2 as not built with threads");
return -1;
# endif # endif
giterr_set(GITERR_SSL, "libgit2 was not built with OpenSSL support");
return -1;
#endif #endif
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment