]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/bconfig.c
alternate fix to ITS#3916
[openldap] / servers / slapd / bconfig.c
index 419282c4e443e1f9db947af7a410857b78315ef5..d050122be294e76f174044fb3474f2d60a8f41bb 100644 (file)
@@ -573,21 +573,25 @@ static ConfigTable config_back_cf_table[] = {
 static ConfigLDAPadd cfAddSchema, cfAddInclude, cfAddDatabase,
        cfAddBackend, cfAddModule, cfAddOverlay;
 
+/* NOTE: be careful when defining array members
+ * that can be conditionally compiled */
 #define CFOC_GLOBAL    cf_ocs[1]
 #define CFOC_SCHEMA    cf_ocs[2]
 #define CFOC_BACKEND   cf_ocs[3]
 #define CFOC_DATABASE  cf_ocs[4]
 #define CFOC_OVERLAY   cf_ocs[5]
 #define CFOC_INCLUDE   cf_ocs[6]
-#define CFOC_MODULE    cf_ocs[7]
-#define CFOC_FRONTEND  cf_ocs[8]
+#define CFOC_FRONTEND  cf_ocs[7]
+#ifdef SLAPD_MODULES
+#define CFOC_MODULE    cf_ocs[8]
+#endif /* SLAPD_MODULES */
 
 static ConfigOCs cf_ocs[] = {
-       { "( OLcfgGlOc:1 "
+       { "( OLcfgGlOc:0 "
                "NAME 'olcConfig' "
                "DESC 'OpenLDAP configuration object' "
                "ABSTRACT SUP top )", Cft_Abstract, NULL },
-       { "( OLcfgGlOc:2 "
+       { "( OLcfgGlOc:1 "
                "NAME 'olcGlobal' "
                "DESC 'OpenLDAP Global configuration options' "
                "SUP olcConfig STRUCTURAL "
@@ -613,19 +617,19 @@ static ConfigOCs cf_ocs[] = {
                 "olcTLSRandFile $ olcTLSVerifyClient $ "
                 "olcObjectIdentifier $ olcAttributeTypes $ olcObjectClasses $ "
                 "olcDitContentRules ) )", Cft_Global },
-       { "( OLcfgGlOc:3 "
+       { "( OLcfgGlOc:2 "
                "NAME 'olcSchemaConfig' "
                "DESC 'OpenLDAP schema object' "
                "SUP olcConfig STRUCTURAL "
                "MAY ( cn $ olcObjectIdentifier $ olcAttributeTypes $ "
                 "olcObjectClasses $ olcDitContentRules ) )",
                        Cft_Schema, NULL, cfAddSchema },
-       { "( OLcfgGlOc:4 "
+       { "( OLcfgGlOc:3 "
                "NAME 'olcBackendConfig' "
                "DESC 'OpenLDAP Backend-specific options' "
                "SUP olcConfig STRUCTURAL "
                "MUST olcBackend )", Cft_Backend, NULL, cfAddBackend },
-       { "( OLcfgGlOc:5 "
+       { "( OLcfgGlOc:4 "
                "NAME 'olcDatabaseConfig' "
                "DESC 'OpenLDAP Database-specific options' "
                "SUP olcConfig STRUCTURAL "
@@ -636,36 +640,36 @@ static ConfigOCs cf_ocs[] = {
                 "olcSchemaDN $ olcSecurity $ olcSizeLimit $ olcSyncrepl $ "
                 "olcTimeLimit $ olcUpdateDN $ olcUpdateRef ) )",
                        Cft_Database, NULL, cfAddDatabase },
-       { "( OLcfgGlOc:6 "
+       { "( OLcfgGlOc:5 "
                "NAME 'olcOverlayConfig' "
                "DESC 'OpenLDAP Overlay-specific options' "
                "SUP olcConfig STRUCTURAL "
                "MUST olcOverlay )", Cft_Overlay, NULL, cfAddOverlay },
-       { "( OLcfgGlOc:7 "
+       { "( OLcfgGlOc:6 "
                "NAME 'olcIncludeFile' "
                "DESC 'OpenLDAP configuration include file' "
                "SUP olcConfig STRUCTURAL "
                "MUST olcInclude "
                "MAY ( cn $ olcRootDSE ) )",
                Cft_Include, NULL, cfAddInclude },
-#ifdef SLAPD_MODULES
-       { "( OLcfgGlOc:8 "
-               "NAME 'olcModuleList' "
-               "DESC 'OpenLDAP dynamic module info' "
-               "SUP olcConfig STRUCTURAL "
-               "MAY ( cn $ olcModulePath $ olcModuleLoad ) )",
-               Cft_Module, NULL, cfAddModule },
-#endif
        /* This should be STRUCTURAL like all the other database classes, but
         * that would mean inheriting all of the olcDatabaseConfig attributes,
         * which causes them to be merged twice in config_build_entry.
         */
-       { "( OLcfgGlOc:9 "
+       { "( OLcfgGlOc:7 "
                "NAME 'olcFrontendConfig' "
                "DESC 'OpenLDAP frontend configuration' "
                "AUXILIARY "
                "MAY olcDefaultSearchBase )",
                Cft_Database, NULL, NULL },
+#ifdef SLAPD_MODULES
+       { "( OLcfgGlOc:8 "
+               "NAME 'olcModuleList' "
+               "DESC 'OpenLDAP dynamic module info' "
+               "SUP olcConfig STRUCTURAL "
+               "MAY ( cn $ olcModulePath $ olcModuleLoad ) )",
+               Cft_Module, NULL, cfAddModule },
+#endif
        { NULL, 0, NULL }
 };
 
@@ -1941,6 +1945,26 @@ slap_loglevel_register( slap_mask_t m, struct berval *s )
        return rc;
 }
 
+int
+str2loglevel( const char *s, int *l )
+{
+       int     i;
+
+       if ( loglevel_ops == NULL ) {
+               loglevel_init();
+       }
+
+       i = verb_to_mask( s, loglevel_ops );
+
+       if ( BER_BVISNULL( &loglevel_ops[ i ].word) ) {
+               return -1;
+       }
+
+       *l = loglevel_ops[ i ].mask;
+
+       return 0;
+}
+
 static int
 config_loglevel(ConfigArgs *c) {
        int i;
@@ -1976,14 +2000,12 @@ config_loglevel(ConfigArgs *c) {
                                return( 1 );
                        }
                } else {
-                       int j = verb_to_mask(c->argv[i], loglevel_ops);
-                       if(BER_BVISNULL(&loglevel_ops[j].word)) {
+                       if ( str2loglevel( c->argv[i], &level ) ) {
                                sprintf( c->msg, "<%s> unknown level", c->argv[0] );
                                Debug( LDAP_DEBUG_ANY, "%s: %s \"%s\"\n",
                                        c->log, c->msg, c->argv[i]);
                                return( 1 );
                        }
-                       level = loglevel_ops[j].mask;
                }
                ldap_syslog |= level;
        }
@@ -2111,7 +2133,7 @@ replica_unparse( struct slap_replica_info *ri, int i, struct berval *bv )
 {
        int len;
        char *ptr;
-       struct berval bc = {0};
+       struct berval bc = BER_BVNULL;
        char numbuf[32];
 
        len = sprintf(numbuf, IFMT, i );
@@ -2203,6 +2225,7 @@ config_replica(ConfigArgs *c) {
                                return(1);
                        }
                        if(!ludp->lud_host) {
+                               ldap_free_urldesc(ludp);
                                sprintf( c->msg, "<%s> invalid uri - missing hostname",
                                        c->argv[0] );
                                Debug(LDAP_DEBUG_ANY, "%s: %s\n", c->log, c->msg, 0 );
@@ -2276,8 +2299,6 @@ config_replica(ConfigArgs *c) {
 
 static int
 config_updatedn(ConfigArgs *c) {
-       struct berval dn;
-       int rc;
        if (c->op == SLAP_CONFIG_EMIT) {
                if (!BER_BVISEMPTY(&c->be->be_update_ndn)) {
                        value_add_one(&c->rvalue_vals, &c->be->be_update_ndn);
@@ -2287,7 +2308,7 @@ config_updatedn(ConfigArgs *c) {
                return 1;
        } else if ( c->op == LDAP_MOD_DELETE ) {
                ch_free( c->be->be_update_ndn.bv_val );
-               c->be->be_update_ndn.bv_val = NULL;
+               BER_BVZERO( &c->be->be_update_ndn );
                SLAP_DBFLAGS(c->be) ^= (SLAP_DBFLAG_SHADOW | SLAP_DBFLAG_SLURP_SHADOW);
                return 0;
        }
@@ -2298,17 +2319,13 @@ config_updatedn(ConfigArgs *c) {
                return(1);
        }
 
-       ber_str2bv(c->argv[1], 0, 0, &dn);
-
-       rc = dnNormalize(0, NULL, NULL, &dn, &c->be->be_update_ndn, NULL);
-
-       if(rc != LDAP_SUCCESS) {
-               sprintf( c->msg, "<%s> invalid DN %d (%s)", c->argv[0],
-                       rc, ldap_err2string(rc));
-               Debug(LDAP_DEBUG_ANY, "%s: %s\n",
-                       c->log, c->msg, 0 );
-               return(1);
+       ber_memfree_x( c->value_dn.bv_val, NULL );
+       if ( !BER_BVISNULL( &c->be->be_update_ndn ) ) {
+               ber_memfree_x( c->be->be_update_ndn.bv_val, NULL );
        }
+       c->be->be_update_ndn = c->value_ndn;
+       BER_BVZERO( &c->value_dn );
+       BER_BVZERO( &c->value_ndn );
 
        SLAP_DBFLAGS(c->be) |= (SLAP_DBFLAG_SHADOW | SLAP_DBFLAG_SLURP_SHADOW);
        return(0);
@@ -3496,7 +3513,7 @@ config_modify_internal( CfEntryInfo *ce, Operation *op, SlapReply *rs,
        
        if(rc == LDAP_SUCCESS) {
                /* check that the entry still obeys the schema */
-               rc = entry_schema_check(op->o_bd, e, NULL, 0,
+               rc = entry_schema_check(op, e, NULL, 0,
                        &rs->sr_text, ca->msg, sizeof(ca->msg) );
        }
        if ( rc == LDAP_SUCCESS ) {