X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fad.c;h=c81422bda8030e4e95b1097259bc7b99bbdba286;hb=a17df0e810578d593808c6afeb0cdea55a65633c;hp=79f58db4047e85883062f8f28485694b49556c12;hpb=421f09435d15ed2cc001b10ac1fa449e72d990e0;p=openldap diff --git a/servers/slapd/ad.c b/servers/slapd/ad.c index 79f58db404..c81422bda8 100644 --- a/servers/slapd/ad.c +++ b/servers/slapd/ad.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -177,7 +177,7 @@ int slap_bv2ad( memset( &desc, 0, sizeof( desc ) ); desc.ad_cname = *bv; name = bv->bv_val; - options = strchr( name, ';' ); + options = ber_bvchr( bv, ';' ); if ( options != NULL && (unsigned) ( options - name ) < bv->bv_len ) { /* don't go past the end of the berval! */ desc.ad_cname.bv_len = options - name; @@ -753,6 +753,11 @@ int slap_bv2undef_ad( desc->ad_next = desc->ad_type->sat_ad; desc->ad_type->sat_ad = desc; ldap_pvt_thread_mutex_unlock( &ad_undef_mutex ); + + Debug( LDAP_DEBUG_ANY, + "%s attributeDescription \"%s\" inserted.\n", + ( flags & SLAP_AD_PROXIED ) ? "PROXIED" : "UNKNOWN", + desc->ad_cname.bv_val, 0 ); } if( !*ad ) { @@ -765,11 +770,15 @@ int slap_bv2undef_ad( } static int -undef_remove( +undef_promote( AttributeType *at, - char *name ) + char *name, + AttributeType *nat ) { - AttributeDescription **u_ad; + AttributeDescription **u_ad, **n_ad; + + /* Get to last ad on the new type */ + for ( n_ad = &nat->sat_ad; *n_ad; n_ad = &(*n_ad)->ad_next ) ; for ( u_ad = &at->sat_ad; *u_ad; ) { struct berval bv; @@ -786,8 +795,9 @@ undef_remove( *u_ad = (*u_ad)->ad_next; - ch_free( tmp ); - + tmp->ad_next = NULL; + *n_ad = tmp; + n_ad = &tmp->ad_next; } else { u_ad = &(*u_ad)->ad_next; } @@ -797,16 +807,17 @@ undef_remove( } int -slap_ad_undef_remove( - char *name ) +slap_ad_undef_promote( + char *name, + AttributeType *at ) { int rc; ldap_pvt_thread_mutex_lock( &ad_undef_mutex ); - rc = undef_remove( slap_schema.si_at_undefined, name ); + rc = undef_promote( slap_schema.si_at_undefined, name, at ); if ( rc == 0 ) { - rc = undef_remove( slap_schema.si_at_proxied, name ); + rc = undef_promote( slap_schema.si_at_proxied, name, at ); } ldap_pvt_thread_mutex_unlock( &ad_undef_mutex ); @@ -977,8 +988,9 @@ anlist2attrs( AttributeName * anlist ) char **attrs; ObjectClass *oc; - attrs = anlist2charray( anlist, 1 ); - + if ( anlist == NULL ) + return NULL; + for ( i = 0; anlist[i].an_name.bv_val; i++ ) { if ( ( oc = anlist[i].an_oc ) ) { for ( j = 0; oc->soc_required && oc->soc_required[j]; j++ ) ; @@ -991,6 +1003,8 @@ anlist2attrs( AttributeName * anlist ) if ( i == 0 ) return NULL; + attrs = anlist2charray( anlist, 1 ); + n = i; if ( k ) @@ -1015,9 +1029,8 @@ anlist2attrs( AttributeName * anlist ) i = 0; while ( attrs && attrs[i] ) { if ( *attrs[i] == '@' ) { + ch_free( attrs[i] ); for ( j = i; attrs[j]; j++ ) { - if ( j == i ) - ch_free( attrs[i] ); attrs[j] = attrs[j+1]; } } else { @@ -1029,9 +1042,8 @@ anlist2attrs( AttributeName * anlist ) j = i + 1; while ( attrs && attrs[j] ) { if ( !strcmp( attrs[i], attrs[j] )) { + ch_free( attrs[j] ); for ( k = j; attrs && attrs[k]; k++ ) { - if ( k == j ) - ch_free( attrs[j] ); attrs[k] = attrs[k+1]; } } else {