summaryrefslogtreecommitdiff
path: root/ldap/apr_ldap_rebind.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/apr_ldap_rebind.c')
-rw-r--r--ldap/apr_ldap_rebind.c34
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 */