From df3da2381138d8476a7bee3e6ea4a9f5998cedc6 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sat, 24 Feb 2007 17:24:48 +0000 Subject: [PATCH] ITS#4848 better config context tracking --- servers/slapd/backover.c | 1 + servers/slapd/bconfig.c | 28 ++++++++++++++++------------ servers/slapd/config.c | 13 ++++++++----- servers/slapd/config.h | 1 + 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index eccc395fed..c9324f3310 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -147,6 +147,7 @@ over_db_config( ca.bi = &on->on_bi; ct = config_find_keyword( on->on_bi.bi_cf_ocs->co_table, &ca ); if ( ct ) { + ca.table = on->on_bi.bi_cf_ocs->co_type; rc = config_add_vals( ct, &ca ); if ( rc != SLAP_CONF_UNKNOWN ) break; diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index baa42e446c..6385306f1a 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -3431,6 +3431,7 @@ config_setup_ldif( BackendDB *be, const char *dir, int readit ) { argv[1] = (char *)dir; argv[2] = NULL; c.argv = argv; + c.table = Cft_Database; ct = config_find_keyword( c.be->be_cf_ocs->co_table, &c ); if ( !ct ) @@ -3667,14 +3668,17 @@ config_send( Operation *op, SlapReply *rs, CfEntryInfo *ce, int depth ) } static ConfigTable * -config_find_table( ConfigOCs **colst, int nocs, AttributeDescription *ad ) +config_find_table( ConfigOCs **colst, int nocs, AttributeDescription *ad, + ConfigArgs *ca ) { int i, j; for (j=0; jco_table[i].name; i++) - if ( colst[j]->co_table[i].ad == ad ) + if ( colst[j]->co_table[i].ad == ad ) { + ca->table = colst[j]->co_type; return &colst[j]->co_table[i]; + } } return NULL; } @@ -4123,28 +4127,28 @@ schema_destroy_one( ConfigArgs *ca, ConfigOCs **colst, int nocs, struct berval bv = BER_BVC("olcDitContentRules"); ad = NULL; slap_bv2ad( &bv, &ad, &text ); - ct = config_find_table( colst, nocs, ad ); + ct = config_find_table( colst, nocs, ad, ca ); config_del_vals( ct, ca ); } if ( cfn->c_oc_head ) { struct berval bv = BER_BVC("olcObjectClasses"); ad = NULL; slap_bv2ad( &bv, &ad, &text ); - ct = config_find_table( colst, nocs, ad ); + ct = config_find_table( colst, nocs, ad, ca ); config_del_vals( ct, ca ); } if ( cfn->c_at_head ) { struct berval bv = BER_BVC("olcAttributeTypes"); ad = NULL; slap_bv2ad( &bv, &ad, &text ); - ct = config_find_table( colst, nocs, ad ); + ct = config_find_table( colst, nocs, ad, ca ); config_del_vals( ct, ca ); } if ( cfn->c_om_head ) { struct berval bv = BER_BVC("olcObjectIdentifier"); ad = NULL; slap_bv2ad( &bv, &ad, &text ); - ct = config_find_table( colst, nocs, ad ); + ct = config_find_table( colst, nocs, ad, ca ); config_del_vals( ct, ca ); } cfo = p->ce_private; @@ -4287,7 +4291,7 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs, for ( a=e->e_attrs; a; a=a->a_next ) { if ( a == oc_at ) continue; - ct = config_find_table( colst, nocs, a->a_desc ); + ct = config_find_table( colst, nocs, a->a_desc, ca ); if ( !ct ) continue; /* user data? */ rc = check_vals( ct, ca, a, 1 ); if ( rc ) goto done_noop; @@ -4296,7 +4300,7 @@ config_add_internal( CfBackInfo *cfb, Entry *e, ConfigArgs *ca, SlapReply *rs, /* Basic syntax checks are OK. Do the actual settings. */ for ( a=e->e_attrs; a; a=a->a_next ) { if ( a == oc_at ) continue; - ct = config_find_table( colst, nocs, a->a_desc ); + ct = config_find_table( colst, nocs, a->a_desc, ca ); if ( !ct ) continue; /* user data? */ for (i=0; a->a_vals[i].bv_val; i++) { char *iptr = NULL; @@ -4645,7 +4649,7 @@ config_modify_internal( CfEntryInfo *ce, Operation *op, SlapReply *rs, strcpy( ca->log, "back-config" ); for (ml = op->orm_modlist; ml; ml=ml->sml_next) { - ct = config_find_table( colst, nocs, ml->sml_desc ); + ct = config_find_table( colst, nocs, ml->sml_desc, ca ); switch (ml->sml_op) { case LDAP_MOD_DELETE: case LDAP_MOD_REPLACE: { @@ -4758,7 +4762,7 @@ config_modify_internal( CfEntryInfo *ce, Operation *op, SlapReply *rs, } /* Basic syntax checks are OK. Do the actual settings. */ for ( ml = op->orm_modlist; ml; ml = ml->sml_next ) { - ct = config_find_table( colst, nocs, ml->sml_desc ); + ct = config_find_table( colst, nocs, ml->sml_desc, ca ); if ( !ct ) continue; s = attr_find( save_attrs, ml->sml_desc ); @@ -4850,7 +4854,7 @@ out: for ( s = save_attrs; s; s = s->a_next ) { if ( s->a_flags & SLAP_ATTR_IXDEL ) { s->a_flags &= ~(SLAP_ATTR_IXDEL|SLAP_ATTR_IXADD); - ct = config_find_table( colst, nocs, s->a_desc ); + ct = config_find_table( colst, nocs, s->a_desc, ca ); a = attr_find( e->e_attrs, s->a_desc ); if ( a ) { /* clear the flag so the add check below will skip it */ @@ -4868,7 +4872,7 @@ out: } for ( a = e->e_attrs; a; a = a->a_next ) { if ( a->a_flags & SLAP_ATTR_IXADD ) { - ct = config_find_table( colst, nocs, a->a_desc ); + ct = config_find_table( colst, nocs, a->a_desc, ca ); ca->valx = -1; ca->line = NULL; config_del_vals( ct, ca ); diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 54dcf2d571..e5ea23bbb5 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -318,8 +318,7 @@ int config_set_vals(ConfigTable *Conf, ConfigArgs *c) { return(0); } if(arg_type & ARG_OFFSET) { - if (c->be && (!overlay_is_over(c->be) || - ((slap_overinfo *)c->be->bd_info)->oi_orig == c->bi)) + if (c->be && c->table == Cft_Database) ptr = c->be->be_private; else if (c->bi) ptr = c->bi->bi_private; @@ -410,8 +409,7 @@ config_get_vals(ConfigTable *cf, ConfigArgs *c) if ( rc ) return rc; } else { if ( cf->arg_type & ARG_OFFSET ) { - if (c->be && (!overlay_is_over(c->be) || - ((slap_overinfo *)c->be->bd_info)->oi_orig == c->bi)) + if (c->be && c->table == Cft_Database) ptr = c->be->be_private; else if ( c->bi ) ptr = c->bi->bi_private; @@ -728,6 +726,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft) ct = config_find_keyword( cft, c ); if ( ct ) { + c->table = Cft_Global; rc = config_add_vals( ct, c ); if ( !rc ) continue; @@ -748,6 +747,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft) if ( c->bi->bi_cf_ocs ) { ct = config_find_keyword( c->bi->bi_cf_ocs->co_table, c ); if ( ct ) { + c->table = c->bi->bi_cf_ocs->co_type; rc = config_add_vals( ct, c ); } } @@ -772,6 +772,7 @@ read_config_file(const char *fname, int depth, ConfigArgs *cf, ConfigTable *cft) if ( c->be->be_cf_ocs ) { ct = config_find_keyword( c->be->be_cf_ocs->co_table, c ); if ( ct ) { + c->table = c->be->be_cf_ocs->co_type; rc = config_add_vals( ct, c ); } } @@ -1914,7 +1915,9 @@ int config_generic_wrapper( Backend *be, const char *fname, int lineno, rc = SLAP_CONF_UNKNOWN; ct = config_find_keyword( be->be_cf_ocs->co_table, &c ); - if ( ct ) + if ( ct ) { + c.table = be->be_cf_ocs->co_type; rc = config_add_vals( ct, &c ); + } return rc; } diff --git a/servers/slapd/config.h b/servers/slapd/config.h index eac44942e9..1115d5884d 100644 --- a/servers/slapd/config.h +++ b/servers/slapd/config.h @@ -142,6 +142,7 @@ typedef struct config_args_s { Entry *ca_entry; /* entry being modified */ void *private; /* anything */ ConfigDriver *cleanup; + ConfigType table; /* which config table did we come from */ } ConfigArgs; /* If lineno is zero, we have an actual LDAP Add request from a client. -- 2.39.5