mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-23 08:09:34 -05:00
Entry must be locked before adding it to the cache.
This removes a race condition upon the entry.
This commit is contained in:
parent
7cd4e05a27
commit
ecdf9a354d
1 changed files with 28 additions and 11 deletions
|
|
@ -123,13 +123,34 @@ ldbm_back_add(
|
||||||
pthread_mutex_unlock(&li->li_add_mutex);
|
pthread_mutex_unlock(&li->li_add_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/* acquire required reader/writer lock */
|
||||||
* Try to add the entry to the cache, assign it a new dnid
|
if (entry_rdwr_lock(e, 1)) {
|
||||||
* and mark it locked. This should only fail if the entry
|
if( p != NULL) {
|
||||||
* already exists.
|
/* 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 );
|
e->e_id = next_id( be );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Try to add the entry to the cache, assign it a new dnid.
|
||||||
|
* This should only fail if the entry already exists.
|
||||||
|
*/
|
||||||
|
|
||||||
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 */
|
||||||
|
|
@ -144,17 +165,13 @@ 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 );
|
||||||
|
|
||||||
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
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue