X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fat.c;h=59bdb98142a23cf8882be565ef94941c41e9198a;hb=86bd3651e1bc6129cf2bd4ba271f33207843aaff;hp=423a6d38e109315438da619f2063501207754823;hpb=81ecb0b1536785c830a264243c969e03a3858af6;p=openldap diff --git a/servers/slapd/at.c b/servers/slapd/at.c index 423a6d38e1..59bdb98142 100644 --- a/servers/slapd/at.c +++ b/servers/slapd/at.c @@ -214,7 +214,31 @@ at_destroy( void ) a = LDAP_STAILQ_FIRST(&attr_list); LDAP_STAILQ_REMOVE_HEAD(&attr_list, sat_next); - if (a->sat_subtypes) ldap_memfree(a->sat_subtypes); + if ( a->sat_equality ) { + MatchingRule *mr; + + mr = mr_find( a->sat_equality->smr_oid ); + assert( mr != NULL ); + if ( mr != a->sat_equality ) { + ch_free( a->sat_equality ); + a->sat_equality = NULL; + } + } + + assert( a->sat_syntax != NULL ); + if ( a->sat_syntax != NULL ) { + Syntax *syn; + + syn = syn_find( a->sat_syntax->ssyn_oid ); + assert( syn != NULL ); + if ( syn != a->sat_syntax ) { + ch_free( a->sat_syntax ); + a->sat_syntax = NULL; + } + } + + if ( a->sat_oidmacro ) ldap_memfree( a->sat_oidmacro ); + if ( a->sat_subtypes ) ldap_memfree( a->sat_subtypes ); ad_destroy(a->sat_ad); ldap_pvt_thread_mutex_destroy(&a->sat_ad_mutex); ldap_attributetype_free((LDAPAttributeType *)a); @@ -223,6 +247,10 @@ at_destroy( void ) if ( slap_schema.si_at_undefined ) { ad_destroy(slap_schema.si_at_undefined->sat_ad); } + + if ( slap_schema.si_at_proxied ) { + ad_destroy(slap_schema.si_at_proxied->sat_ad); + } } int @@ -376,6 +404,18 @@ at_insert( } } + if ( sat->sat_oid ) { + slap_ad_undef_promote( sat->sat_oid, sat ); + } + + names = sat->sat_names; + if ( names ) { + while ( *names ) { + slap_ad_undef_promote( *names, sat ); + names++; + } + } + LDAP_STAILQ_INSERT_TAIL( &attr_list, sat, sat_next ); return 0; @@ -383,10 +423,10 @@ at_insert( int at_add( - LDAPAttributeType *at, - int user, - AttributeType **rsat, - const char **err ) + LDAPAttributeType *at, + int user, + AttributeType **rsat, + const char **err ) { AttributeType *sat; MatchingRule *mr; @@ -706,6 +746,11 @@ error_return:; ch_free( sat ); } + if ( oidm ) { + SLAP_FREE( at->at_oid ); + at->at_oid = oidm; + } + } else if ( rsat ) { *rsat = sat; }