Skip to content
Snippets Groups Projects
Commit ecdf9a35 authored by Kurt Zeilenga's avatar Kurt Zeilenga
Browse files

Entry must be locked before adding it to the cache.

This removes a race condition upon the entry.
parent 7cd4e05a
No related branches found
No related tags found
No related merge requests found
......@@ -123,13 +123,34 @@ ldbm_back_add(
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);
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
* and mark it locked. This should only fail if the entry
* already exists.
* Try to add the entry to the cache, assign it a new dnid.
* This should only fail if the entry already exists.
*/
e->e_id = next_id( be );
if ( cache_add_entry_lock( &li->li_cache, e, ENTRY_STATE_CREATING ) != 0 ) {
if( p != NULL) {
/* free parent and writer lock */
......@@ -144,17 +165,13 @@ ldbm_back_add(
0 );
next_id_return( be, e->e_id );
/* XXX this should be ok, no other thread should have access
* because e hasn't been added to the cache yet
*/
entry_rdwr_unlock(e, 1);;
entry_free( e );
send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, "", "" );
return( -1 );
}
/* acquire writer lock */
entry_rdwr_lock(e, 1);
/*
* add it to the id2children index for the parent
*/
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment