Commit f1231b12 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Import entry_rwlock() call reordering to remove race condition.

parent 45500b3b
...@@ -128,13 +128,35 @@ ldbm_back_add( ...@@ -128,13 +128,35 @@ ldbm_back_add(
pthread_mutex_unlock(&li->li_add_mutex); pthread_mutex_unlock(&li->li_add_mutex);
} }
/* acquire required reader/writer lock */
if (entry_rdwr_lock(e, 1)) {
if( p != NULL) {
/* free parent and writer lock */
cache_return_entry_w( &li->li_cache, p );
}
if ( rootlock ) {
/* release root lock */
pthread_mutex_unlock(&li->li_root_mutex);
}
Debug( LDAP_DEBUG_ANY, "add: could not lock entry\n",
0, 0, 0 );
entry_free(e);
free( dn );
send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, "", "" );
return( -1 );
}
e->e_id = next_id( be );
/* /*
* Try to add the entry to the cache, assign it a new dnid * Try to add the entry to the cache, assign it a new dnid.
* and mark it locked. This should only fail if the entry * This should only fail if the entry already exists.
* already exists.
*/ */
e->e_id = next_id( be );
if ( cache_add_entry_lock( &li->li_cache, e, ENTRY_STATE_CREATING ) != 0 ) { if ( cache_add_entry_lock( &li->li_cache, e, ENTRY_STATE_CREATING ) != 0 ) {
if( p != NULL) { if( p != NULL) {
/* free parent and writer lock */ /* free parent and writer lock */
...@@ -149,18 +171,14 @@ ldbm_back_add( ...@@ -149,18 +171,14 @@ ldbm_back_add(
0 ); 0 );
next_id_return( be, e->e_id ); next_id_return( be, e->e_id );
/* XXX this should be ok, no other thread should have access entry_rdwr_unlock(e, 1);;
* because e hasn't been added to the cache yet
*/
entry_free( e ); entry_free( e );
free( dn ); free( dn );
send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" ); send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" );
return( -1 ); return( -1 );
} }
/* acquire writer lock */
entry_rdwr_lock(e, 1);
/* /*
* add it to the id2children index for the parent * add it to the id2children index for the parent
*/ */
......
Supports Markdown
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