diff options
Diffstat (limited to 'ldap/apr_ldap_rebind.c')
-rw-r--r-- | ldap/apr_ldap_rebind.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/ldap/apr_ldap_rebind.c b/ldap/apr_ldap_rebind.c index 4818d05c..1f91b2bb 100644 --- a/ldap/apr_ldap_rebind.c +++ b/ldap/apr_ldap_rebind.c @@ -64,6 +64,14 @@ static apr_ldap_rebind_entry_t *xref_head = NULL; static int apr_ldap_rebind_set_callback(LDAP *ld); static apr_status_t apr_ldap_rebind_remove_helper(void *data); +static apr_status_t apr_ldap_pool_cleanup_set_null(void *data_) +{ + void **ptr = (void **)data_; + *ptr = NULL; + return APR_SUCCESS; +} + + /* APR utility routine used to create the xref_lock. */ APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool) { @@ -74,6 +82,10 @@ APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_init(apr_pool_t *pool) #endif #if APR_HAS_THREADS + /* run after apr_thread_mutex_create cleanup */ + apr_pool_cleanup_register(pool, &apr_ldap_xref_lock, apr_ldap_pool_cleanup_set_null, + apr_pool_cleanup_null); + if (apr_ldap_xref_lock == NULL) { retcode = apr_thread_mutex_create(&apr_ldap_xref_lock, APR_THREAD_MUTEX_DEFAULT, pool); } @@ -107,14 +119,20 @@ APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool, } #if APR_HAS_THREADS - apr_thread_mutex_lock(apr_ldap_xref_lock); + retcode = apr_thread_mutex_lock(apr_ldap_xref_lock); + if (retcode != APR_SUCCESS) { + return retcode; + } #endif new_xref->next = xref_head; xref_head = new_xref; #if APR_HAS_THREADS - apr_thread_mutex_unlock(apr_ldap_xref_lock); + retcode = apr_thread_mutex_unlock(apr_ldap_xref_lock); + if (retcode != APR_SUCCESS) { + return retcode; + } #endif } else { @@ -138,13 +156,17 @@ APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_add(apr_pool_t *pool, APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld) { apr_ldap_rebind_entry_t *tmp_xref, *prev = NULL; + apr_status_t retcode = 0; #ifdef NETWARE get_apd #endif #if APR_HAS_THREADS - apr_thread_mutex_lock(apr_ldap_xref_lock); + retcode = apr_thread_mutex_lock(apr_ldap_xref_lock); + if (retcode != APR_SUCCESS) { + return retcode; + } #endif tmp_xref = xref_head; @@ -169,7 +191,10 @@ APU_DECLARE_LDAP(apr_status_t) apr_ldap_rebind_remove(LDAP *ld) } #if APR_HAS_THREADS - apr_thread_mutex_unlock(apr_ldap_xref_lock); + retcode = apr_thread_mutex_unlock(apr_ldap_xref_lock); + if (retcode != APR_SUCCESS) { + return retcode; + } #endif return APR_SUCCESS; } @@ -348,4 +373,5 @@ static int apr_ldap_rebind_set_callback(LDAP *ld) #endif + #endif /* APR_HAS_LDAP */ |