]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/dn2id.c
error out when adding multiple olcIndex values for the same attribute (ITS#6196)
[openldap] / servers / slapd / back-bdb / dn2id.c
index 2a927f3a4f5e32da6d3467e12856870c0628f02c..2d1748c328585fa5ead21ab0487519e911e4155d 100644 (file)
@@ -529,8 +529,8 @@ int hdb_fix_dn(
                }
        }
        BEI(e)->bei_modrdns = max;
-       ptr[-1] = '\0';
-       nptr[-1] = '\0';
+       if ( ptr > e->e_name.bv_val ) ptr[-1] = '\0';
+       if ( nptr > e->e_nname.bv_val ) nptr[-1] = '\0';
 
        return 0;
 }
@@ -623,6 +623,11 @@ hdb_dn2id_add(
                                tmp[1] = eip->bei_id;
                                bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
                        }
+                       /* Handle DB with empty suffix */
+                       if ( !op->o_bd->be_suffix[0].bv_len && eip ) {
+                               tmp[1] = eip->bei_id;
+                               bdb_idl_cache_add_id( bdb, db, &key, e->e_id );
+                       }
                }
        }
 
@@ -722,6 +727,11 @@ func_leave:
                                tmp[1] = eip->bei_id;
                                bdb_idl_cache_del_id( bdb, db, &key, e->e_id );
                        }
+                       /* Handle DB with empty suffix */
+                       if ( !op->o_bd->be_suffix[0].bv_len && eip ) {
+                               tmp[1] = eip->bei_id;
+                               bdb_idl_cache_del_id( bdb, db, &key, e->e_id );
+                       }
                }
        }
        Debug( LDAP_DEBUG_TRACE, "<= hdb_dn2id_delete 0x%lx: %d\n", e->e_id, rc, 0 );
@@ -1092,7 +1102,7 @@ hdb_dn2idl_internal(
                cx->rc = cx->dbc->c_close( cx->dbc );
 done_one:
                bdb_cache_entryinfo_lock( cx->ei );
-               cx->ei->bei_state ^= CACHE_ENTRY_ONELEVEL;
+               cx->ei->bei_state &= ~CACHE_ENTRY_ONELEVEL;
                bdb_cache_entryinfo_unlock( cx->ei );
                if ( cx->rc )
                        return cx->rc;
@@ -1141,15 +1151,23 @@ gotit:
                                for ( cx->id = bdb_idl_first( save, &idcurs );
                                        cx->id != NOID;
                                        cx->id = bdb_idl_next( save, &idcurs )) {
-                                       cx->ei = bdb_cache_find_info( cx->bdb, cx->id );
-                                       if ( !cx->ei ||
-                                               ( cx->ei->bei_state & CACHE_ENTRY_NO_KIDS ))
+                                       EntryInfo *ei2;
+                                       cx->ei = NULL;
+                                       if ( bdb_cache_find_id( cx->op, cx->txn, cx->id, &cx->ei,
+                                               ID_NOENTRY, NULL ))
                                                continue;
-
-                                       BDB_ID2DISK( cx->id, &cx->nid );
-                                       hdb_dn2idl_internal( cx );
-                                       if ( !BDB_IDL_IS_ZERO( cx->tmp ))
-                                               nokids = 0;
+                                       if ( cx->ei ) {
+                                               ei2 = cx->ei;
+                                               if ( !( ei2->bei_state & CACHE_ENTRY_NO_KIDS )) {
+                                                       BDB_ID2DISK( cx->id, &cx->nid );
+                                                       hdb_dn2idl_internal( cx );
+                                                       if ( !BDB_IDL_IS_ZERO( cx->tmp ))
+                                                               nokids = 0;
+                                               }
+                                               bdb_cache_entryinfo_lock( ei2 );
+                                               ei2->bei_finders--;
+                                               bdb_cache_entryinfo_unlock( ei2 );
+                                       }
                                }
                                cx->depth--;
                                cx->op->o_tmpfree( save, cx->op->o_tmpmemctx );