X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fad.c;h=c9601a3a10b33be83fd806f5a9ae55763d0d4c48;hb=c3960b98d3b5fbd6ebeb200ca7799ece7b766d50;hp=2b32e533c78812a9e425f7a2316a152c67852815;hpb=7cf72ec0001b6201fd20c51b352a17eb0a00ee3b;p=openldap diff --git a/servers/slapd/ad.c b/servers/slapd/ad.c index 2b32e533c7..c9601a3a10 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 @@ -124,20 +124,21 @@ int slap_str2ad( } static char *strchrlen( - const char *p, + const char *beg, + const char *end, const char ch, int *len ) { - int i; + const char *p; - for( i=0; p[i]; i++ ) { - if( p[i] == ch ) { - *len = i; - return (char *) &p[i]; + for( p=beg; *p && p < end; p++ ) { + if( *p == ch ) { + *len = p - beg; + return (char *) p; } } - *len = i; + *len = p - beg; return NULL; } @@ -148,7 +149,7 @@ int slap_bv2ad( { int rtn = LDAP_UNDEFINED_TYPE; AttributeDescription desc, *d2; - char *name, *options; + char *name, *options, *optn; char *opt, *next; int ntags; int tagslen; @@ -177,7 +178,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; @@ -201,11 +202,12 @@ int slap_bv2ad( ntags = 0; memset( tags, 0, sizeof( tags )); tagslen = 0; + optn = bv->bv_val + bv->bv_len; for( opt=options; opt != NULL; opt=next ) { int optlen; opt++; - next = strchrlen( opt, ';', &optlen ); + next = strchrlen( opt, optn, ';', &optlen ); if( optlen == 0 ) { *text = "zero length option is invalid"; @@ -443,19 +445,21 @@ static int is_ad_subtags( struct berval *subtagsbv, struct berval *suptagsbv ) { - const char *suptags, *supp, *supdelimp; - const char *subtags, *subp, *subdelimp; + const char *suptags, *supp, *supdelimp, *supn; + const char *subtags, *subp, *subdelimp, *subn; int suplen, sublen; subtags =subtagsbv->bv_val; suptags =suptagsbv->bv_val; + subn = subtags + subtagsbv->bv_len; + supn = suptags + suptagsbv->bv_len; for( supp=suptags ; supp; supp=supdelimp ) { - supdelimp = strchrlen( supp, ';', &suplen ); + supdelimp = strchrlen( supp, supn, ';', &suplen ); if( supdelimp ) supdelimp++; for( subp=subtags ; subp; subp=subdelimp ) { - subdelimp = strchrlen( subp, ';', &sublen ); + subdelimp = strchrlen( subp, subn, ';', &sublen ); if( subdelimp ) subdelimp++; if ( suplen > sublen @@ -770,11 +774,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; @@ -791,8 +799,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; } @@ -802,16 +811,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 ); @@ -982,8 +992,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++ ) ; @@ -996,6 +1007,8 @@ anlist2attrs( AttributeName * anlist ) if ( i == 0 ) return NULL; + attrs = anlist2charray( anlist, 1 ); + n = i; if ( k ) @@ -1020,9 +1033,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 { @@ -1034,9 +1046,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 { @@ -1170,6 +1181,15 @@ ad_define_option( const char *name, const char *fname, int lineno ) return 0; } +void +ad_unparse_options( BerVarray *res ) +{ + int i; + for ( i = 0; i < option_count; i++ ) { + value_add_one( res, &options[i].name ); + } +} + /* Find the definition of the option name or prefix matching the arguments */ static Attr_option * ad_find_option_definition( const char *opt, int optlen )