Fixed slapd inappropriate bind error disclosure bugs
Fixed slapd sun_path portability bug
Fixed slapd passwd referral memory leak
- Fixed slapd sasl userdb checkpass bug
- Fixed ldapmodify missing error information bug (ITS#3057)
+ Fixed slapd sasl userdb checkpass bug (ITS#3048)
Fixed back-meta compare return code (ITS#3042)
- Added slapd Delivery Method syntax validation
+ Fixed back-ldbm IDL delete bug (ITS#3042)
+ Fixed back-ldbm modrdn indexing bug (ITS#3059)
+ Fixed ldapmodify missing error information bug (ITS#3057)
+ Added slapd Delivery Method syntax validation (ITS#3052)
Updated slapd overlay framework
- Updated back-ldap backend
- Updated back-meta backend
Build Environment
Fixed slapd dynamic backend build (ITS#3044)
Removed deprecated configure options
*/
cont_alloc( &data, &key );
#ifndef USE_INDIRECT_NIDS
- for ( nids = 0; !ID_BLOCK_NOID(idl, nids); nids++ )
- ; /* NULL */
+ for ( nids = 0; !ID_BLOCK_NOID(idl, nids); nids++ ) {
+ ; /* Empty */
+ }
for ( j = 0; j<nids; j++ )
#else
nids = ID_BLOCK_NIDS(idl);
- for ( j = idl_find(idl, id); j >= 0; j = -1) /* execute once */
+ j = idl_find(idl, id);
+ if ( ID_BLOCK_ID(idl, j) > id ) j--;
+ for (; j>=0; j = -1 ) /* execute once */
#endif
{
ID_BLOCK *tmp;
goto return_results;
}
- /* add new one */
- if ( dn2id_add( op->o_bd, &e->e_nname, e->e_id ) != 0 ) {
- send_ldap_error( op, rs, LDAP_OTHER,
- "DN index add failed" );
- goto return_results;
- }
+ /*
+ * NOTE: the backend MUST delete then add the entry,
+ * otherwise indexing may get hosed
+ * FIXME: if a new ID was used, the add could be done first.
+ * that would be safer.
+ */
+
/* delete old one */
if ( dn2id_delete( op->o_bd, &old_ndn, e->e_id ) != 0 ) {
- /* undo add of new one */
- dn2id_delete( op->o_bd, &e->e_nname, e->e_id );
send_ldap_error( op, rs, LDAP_OTHER,
"DN index delete fail" );
goto return_results;
}
+ /* add new one */
+ if ( dn2id_add( op->o_bd, &e->e_nname, e->e_id ) != 0 ) {
+ /* try to repair old entry - probably hopeless */
+ if( dn2id_add( op->o_bd, &old_ndn, e->e_id) != 0 ) {
+ send_ldap_error( op, rs, LDAP_OTHER,
+ "DN index add and repair failed" );
+ } else {
+ send_ldap_error( op, rs, LDAP_OTHER,
+ "DN index add failed" );
+ }
+ goto return_results;
+ }
+
/* id2entry index */
if ( id2entry_add( op->o_bd, e ) != 0 ) {
/* Try to undo */
- dn2id_delete( op->o_bd, &e->e_nname, e->e_id );
- dn2id_add( op->o_bd, &old_ndn, e->e_id );
- send_ldap_error( op, rs, LDAP_OTHER,
- "entry update failed" );
+ int rc;
+ rc = dn2id_delete( op->o_bd, &e->e_nname, e->e_id );
+ rc |= dn2id_add( op->o_bd, &old_ndn, e->e_id );
+ if( rc ) {
+ send_ldap_error( op, rs, LDAP_OTHER,
+ "entry update and repair failed" );
+ } else {
+ send_ldap_error( op, rs, LDAP_OTHER,
+ "entry update failed" );
+ }
goto return_results;
}