From 95a19b9468f985bbea0dc92cd5ecc4dd44b4e489 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 20 Dec 2005 18:35:54 +0000 Subject: [PATCH] ITS#4260/4263: slapd-bdb/hdb cn=config reindexing issues --- CHANGES | 4 +- servers/slapd/back-bdb/config.c | 76 +++++++++++++++++++++++++-------- servers/slapd/config.c | 1 + 3 files changed, 63 insertions(+), 18 deletions(-) diff --git a/CHANGES b/CHANGES index 68831701e9..5a8f87c155 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,9 @@ OpenLDAP 2.3.14 Engineering Fixed slapd assertion control restrictions Fixed slapd ACL exact attrval clause needs normalization (ITS#4255) Fixed slapd sc_prev update after free bug (ITS#4237) - Fixed slapd-bdb/hdb mode argument parsing (ITS#425h) + Fixed slapd-bdb/hdb mode argument parsing (ITS#4257) + Fixed slapd-bdb/hdb cn=config reindexing (ITS#4260) + Fixed slapd-bdb/hdb cn=config olcDbIndex modify/replace (ITS#4262) Fixed slapo-rwm static DN free bug (ITS#4248) OpenLDAP 2.3.13 Release diff --git a/servers/slapd/back-bdb/config.c b/servers/slapd/back-bdb/config.c index 637bc027ac..d9f00f210f 100644 --- a/servers/slapd/back-bdb/config.c +++ b/servers/slapd/back-bdb/config.c @@ -183,6 +183,7 @@ bdb_online_index( void *ctx, void *arg ) ID id, nid; EntryInfo *ei; int rc, getnext = 1; + int i; connection_fake_init( &conn, op, ctx ); @@ -264,6 +265,14 @@ bdb_online_index( void *ctx, void *arg ) getnext = 1; } + for ( i = 0; i < bdb->bi_nattrs; i++ ) { + if ( bdb->bi_attrs[ i ]->ai_indexmask & BDB_INDEX_DELETING ) { + continue; + } + bdb->bi_attrs[ i ]->ai_indexmask = bdb->bi_attrs[ i ]->ai_newmask; + bdb->bi_attrs[ i ]->ai_newmask = 0; + } + ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex ); ldap_pvt_runqueue_stoptask( &slapd_rq, rtask ); bdb->bi_index_task = NULL; @@ -458,26 +467,59 @@ bdb_cf_gen(ConfigArgs *c) case BDB_NOSYNC: bdb->bi_dbenv->set_flags( bdb->bi_dbenv, DB_TXN_NOSYNC, 0 ); break; - case BDB_INDEX: { - AttributeDescription *ad = NULL; - struct berval bv, def = BER_BVC("default"); - char *ptr; - const char *text; - for (ptr = c->line; !isspace( *ptr ); ptr++); - bv.bv_val = c->line; - bv.bv_len = ptr - bv.bv_val; - if ( bvmatch( &bv, &def )) { - bdb->bi_defaultmask = 0; + case BDB_INDEX: + if ( c->valx == -1 ) { + int i; + + /* delete all (FIXME) */ + for ( i = 0; i < bdb->bi_nattrs; i++ ) { + bdb->bi_attrs[i]->ai_indexmask |= BDB_INDEX_DELETING; + } + bdb->bi_flags |= BDB_DEL_INDEX; + c->cleanup = bdb_cf_cleanup; + } else { - slap_bv2ad( &bv, &ad, &text ); - if ( ad ) { - AttrInfo *ai = bdb_attr_mask( bdb, ad ); - ai->ai_indexmask |= BDB_INDEX_DELETING; - bdb->bi_flags |= BDB_DEL_INDEX; - c->cleanup = bdb_cf_cleanup; + struct berval bv, def = BER_BVC("default"); + char *ptr; + + for (ptr = c->line; !isspace( *ptr ); ptr++); + + bv.bv_val = c->line; + bv.bv_len = ptr - bv.bv_val; + if ( bvmatch( &bv, &def )) { + bdb->bi_defaultmask = 0; + + } else { + int i; + char **attrs; + char sep; + + sep = bv.bv_val[ bv.bv_len ]; + bv.bv_val[ bv.bv_len ] = '\0'; + attrs = ldap_str2charray( bv.bv_val, "," ); + + for ( i = 0; attrs[ i ]; i++ ) { + AttributeDescription *ad = NULL; + const char *text; + AttrInfo *ai; + + slap_str2ad( attrs[ i ], &ad, &text ); + /* if we got here... */ + assert( ad != NULL ); + + ai = bdb_attr_mask( bdb, ad ); + /* if we got here... */ + assert( ai != NULL ); + + ai->ai_indexmask |= BDB_INDEX_DELETING; + bdb->bi_flags |= BDB_DEL_INDEX; + c->cleanup = bdb_cf_cleanup; + } + + bv.bv_val[ bv.bv_len ] = sep; + ldap_charray_free( attrs ); } } - } break; } return rc; diff --git a/servers/slapd/config.c b/servers/slapd/config.c index a6f462388d..6336e3a58f 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -628,6 +628,7 @@ config_parse_vals(ConfigTable *ct, ConfigArgs *c, int valx) } rc = config_check_vals( ct, c, 1 ); ch_free( c->tline ); + c->tline = NULL; if ( rc ) rc = LDAP_CONSTRAINT_VIOLATION; -- 2.39.5