diff --git a/CHANGES b/CHANGES index 2e3b1cd57ff0fb9ad58decc5c8e68e57050cdeca..8910b4d2f3eaa674ab516bd36f79a202119af0f9 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,8 @@ OpenLDAP 2.4 Change Log OpenLDAP 2.4.25 Engineering + Fixed slapd add objectclasses in order (ITS#6837) + Fixed slapd-ldap chain cn=config support (ITS#6837) Build Environment Fixed libldap/lberl/util if/else usage (ITS#6832) Fixed Windows odbc32 detection (ITS#6125) diff --git a/servers/slapd/back-ldap/chain.c b/servers/slapd/back-ldap/chain.c index 759fb53157501ad7450cc4fb9f67eb70a133932f..f9e3ac157c8c8a003f82e08e068a522e7e7f5b3b 100644 --- a/servers/slapd/back-ldap/chain.c +++ b/servers/slapd/back-ldap/chain.c @@ -1269,7 +1269,7 @@ static ConfigOCs chainocs[] = { { "( OLcfgOvOc:3.2 " "NAME 'olcChainDatabase' " "DESC 'Chain remote server configuration' " - "AUXILIARY )", + "SUP olcLDAPConfig )", Cft_Misc, olcDatabaseDummy, chain_ldadd }, { NULL, 0, NULL } }; diff --git a/servers/slapd/back-ldap/init.c b/servers/slapd/back-ldap/init.c index bb05dd5d1c97f193903b16df3de82c03cc2ec013..60e60c5fe9f1375d3e7b1fd0ae45f8d0ee2a18df 100644 --- a/servers/slapd/back-ldap/init.c +++ b/servers/slapd/back-ldap/init.c @@ -100,6 +100,11 @@ ldap_back_initialize( BackendInfo *bi ) bi->bi_extra = (void *)&ldap_extra; + rc = ldap_back_init_cf( bi ); + if ( rc ) { + return rc; + } + rc = chain_initialize(); if ( rc ) { return rc; @@ -116,8 +121,7 @@ ldap_back_initialize( BackendInfo *bi ) return rc; } #endif - - return ldap_back_init_cf( bi ); + return rc; } int diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index f7154b5124764e00ad2280ffdf4562afccc4fcf7..c657ed0fd914513304aa95eada97ce9816450f3e 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -4568,6 +4568,12 @@ count_oc( ObjectClass *oc, ConfigOCs ***copp, int *nocs ) ConfigOCs co, *cop; ObjectClass **sups; + for ( sups = oc->soc_sups; sups && *sups; sups++ ) { + if ( count_oc( *sups, copp, nocs ) ) { + return -1; + } + } + co.co_name = &oc->soc_cname; cop = avl_find( CfOcTree, &co, CfOc_cmp ); if ( cop ) { @@ -4591,27 +4597,18 @@ count_oc( ObjectClass *oc, ConfigOCs ***copp, int *nocs ) } } - for ( sups = oc->soc_sups; sups && *sups; sups++ ) { - if ( count_oc( *sups, copp, nocs ) ) { - return -1; - } - } - return 0; } static ConfigOCs ** count_ocs( Attribute *oc_at, int *nocs ) { - int i; + int i, j; ConfigOCs **colst = NULL; *nocs = 0; - for ( i = 0; !BER_BVISNULL( &oc_at->a_nvals[i] ); i++ ) - /* count attrs */ ; - - for ( ; i--; ) { + for ( i = oc_at->a_numvals; i--; ) { ObjectClass *oc = oc_bvfind( &oc_at->a_nvals[i] ); assert( oc != NULL ); @@ -4621,6 +4618,16 @@ count_ocs( Attribute *oc_at, int *nocs ) } } + /* invert order */ + i = 0; + j = *nocs - 1; + while ( i < j ) { + ConfigOCs *tmp = colst[i]; + colst[i] = colst[j]; + colst[j] = tmp; + i++; j--; + } + return colst; }