diff --git a/servers/slapd/aclparse.c b/servers/slapd/aclparse.c index 3f0e3817228ae1c2b5955c592693aa0eac31fb4a..9a405660d7ac460b4737aaf9d58cfc801f50a357 100644 --- a/servers/slapd/aclparse.c +++ b/servers/slapd/aclparse.c @@ -2774,7 +2774,7 @@ acl_unparse( AccessControl *a, struct berval *bv ) for ( an = a->acl_attrs; an && !BER_BVISNULL( &an->an_name ); an++ ) { if ( ! first ) *ptr++ = ','; if (an->an_oc) { - *ptr++ = an->an_oc_exclude ? '!' : '@'; + *ptr++ = ( an->an_flags & SLAP_AN_OCEXCLUDE ) ? '!' : '@'; ptr = lutil_strcopy( ptr, an->an_oc->soc_cname.bv_val ); } else { diff --git a/servers/slapd/ad.c b/servers/slapd/ad.c index c881612799f6492f5782efa83204fb7df14e71ed..4c118c4313f84803fdba2ab68ac6f3aba226976f 100644 --- a/servers/slapd/ad.c +++ b/servers/slapd/ad.c @@ -594,29 +594,33 @@ int ad_inlist( * else if requested description is !objectClass, return * attributes which the class does not require/allow */ - oc = attrs->an_oc; - if( oc == NULL && attrs->an_name.bv_val ) { - switch( attrs->an_name.bv_val[0] ) { - case '@': /* @objectClass */ - case '+': /* +objectClass (deprecated) */ - case '!': { /* exclude */ - struct berval ocname; - ocname.bv_len = attrs->an_name.bv_len - 1; - ocname.bv_val = &attrs->an_name.bv_val[1]; - oc = oc_bvfind( &ocname ); - attrs->an_oc_exclude = 0; - if ( oc && attrs->an_name.bv_val[0] == '!' ) { - attrs->an_oc_exclude = 1; - } - } break; + if ( !( attrs->an_flags & SLAP_AN_OCINITED )) { + if( attrs->an_name.bv_val ) { + switch( attrs->an_name.bv_val[0] ) { + case '@': /* @objectClass */ + case '+': /* +objectClass (deprecated) */ + case '!': { /* exclude */ + struct berval ocname; + ocname.bv_len = attrs->an_name.bv_len - 1; + ocname.bv_val = &attrs->an_name.bv_val[1]; + oc = oc_bvfind( &ocname ); + if ( oc && attrs->an_name.bv_val[0] == '!' ) { + attrs->an_flags |= SLAP_AN_OCEXCLUDE; + } else { + attrs->an_flags &= ~SLAP_AN_OCEXCLUDE; + } + } break; - default: /* old (deprecated) way */ - oc = oc_bvfind( &attrs->an_name ); + default: /* old (deprecated) way */ + oc = oc_bvfind( &attrs->an_name ); + } + attrs->an_oc = oc; } - attrs->an_oc = oc; + attrs->an_flags |= SLAP_AN_OCINITED; } + oc = attrs->an_oc; if( oc != NULL ) { - if ( attrs->an_oc_exclude ) { + if ( attrs->an_flags & SLAP_AN_OCEXCLUDE ) { if ( oc == slap_schema.si_oc_extensibleObject ) { /* extensibleObject allows the return of anything */ return 0; @@ -932,7 +936,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr ) anew->an_desc = NULL; anew->an_oc = NULL; - anew->an_oc_exclude = 0; + anew->an_flags = 0; ber_str2bv(s, 0, 1, &anew->an_name); slap_bv2ad(&anew->an_name, &anew->an_desc, &text); if ( !anew->an_desc ) { @@ -959,7 +963,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr ) } if ( anew->an_name.bv_val[0] == '!' ) { - anew->an_oc_exclude = 1; + anew->an_flags |= SLAP_AN_OCEXCLUDE; } } break; @@ -971,6 +975,7 @@ str2anlist( AttributeName *an, char *in, const char *brkstr ) } } } + anew->an_flags |= SLAP_AN_OCINITED; anew++; } diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index 93476070d1a8b3a86e03933ef59d78cedca8d0ca..d20dbd30ae3c31c44cb2221da59ebbf7bd57f0cb 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -1414,7 +1414,7 @@ parseReadAttrs( an[i].an_desc = NULL; an[i].an_oc = NULL; - an[i].an_oc_exclude = 0; + an[i].an_flags = 0; rc = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy ); if ( rc == LDAP_SUCCESS ) { an[i].an_name = an[i].an_desc->ad_cname; diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index 80a5d74028e716342ccb375e56d0b8a492e3e529..3a1a5fa60b0732f46adc6bcc7659b0f40de63ced 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -1605,7 +1605,7 @@ filter2template( (*filter_attrs)[*filter_cnt].an_desc = ad; (*filter_attrs)[*filter_cnt].an_name = ad->ad_cname; (*filter_attrs)[*filter_cnt].an_oc = NULL; - (*filter_attrs)[*filter_cnt].an_oc_exclude = 0; + (*filter_attrs)[*filter_cnt].an_flags = 0; BER_BVZERO( &(*filter_attrs)[*filter_cnt+1].an_name ); (*filter_cnt)++; if ( ad == slap_schema.si_ad_objectClass ) @@ -2202,14 +2202,14 @@ add_filter_attrs( (*new_attrs)[j].an_name = filter_attrs[i].an_name; (*new_attrs)[j].an_desc = filter_attrs[i].an_desc; (*new_attrs)[j].an_oc = NULL; - (*new_attrs)[j].an_oc_exclude = 0; + (*new_attrs)[j].an_flags = 0; j++; } if ( addoc ) { (*new_attrs)[j].an_name = slap_schema.si_ad_objectClass->ad_cname; (*new_attrs)[j].an_desc = slap_schema.si_ad_objectClass; (*new_attrs)[j].an_oc = NULL; - (*new_attrs)[j].an_oc_exclude = 0; + (*new_attrs)[j].an_flags = 0; j++; } BER_BVZERO( &(*new_attrs)[j].an_name ); @@ -3039,7 +3039,7 @@ pc_cf_gen( ConfigArgs *c ) attr_name->an_name = attr_name->an_desc->ad_cname; } attr_name->an_oc = NULL; - attr_name->an_oc_exclude = 0; + attr_name->an_flags = 0; if ( attr_name->an_desc == slap_schema.si_ad_objectClass ) qm->attr_sets[num].flags |= PC_GOT_OC; attr_name++; diff --git a/servers/slapd/search.c b/servers/slapd/search.c index be0b283f82df49cb037018088e047ecc8640dc45..ecdae3ce6154d32526cbf4d45a03205e96753b70 100644 --- a/servers/slapd/search.c +++ b/servers/slapd/search.c @@ -152,7 +152,7 @@ do_search( const char *dummy; /* ignore msgs from bv2ad */ op->ors_attrs[i].an_desc = NULL; op->ors_attrs[i].an_oc = NULL; - op->ors_attrs[i].an_oc_exclude = 0; + op->ors_attrs[i].an_flags = 0; if ( slap_bv2ad( &op->ors_attrs[i].an_name, &op->ors_attrs[i].an_desc, &dummy ) != LDAP_SUCCESS ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 3fb72f03701b3ea83e6f44954080558bc2f756e9..7eb3908dcbd7f63342a8efeb85721f174c205363 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -842,10 +842,13 @@ struct AttributeDescription { #define SLAP_AD_PROXIED 0x01U #define SLAP_AD_NOINSERT 0x02U +#define SLAP_AN_OCEXCLUDE 0x01 +#define SLAP_AN_OCINITED 0x02 + struct AttributeName { struct berval an_name; AttributeDescription *an_desc; - int an_oc_exclude; + int an_flags; ObjectClass *an_oc; }; diff --git a/servers/slapd/slapi/slapi_pblock.c b/servers/slapd/slapi/slapi_pblock.c index bdff8eba3f49b2e4b006dc507cf55e9295eebe91..28615bbd3670fed86dc8f1a5001158c24b631c80 100644 --- a/servers/slapd/slapi/slapi_pblock.c +++ b/servers/slapd/slapi/slapi_pblock.c @@ -1152,7 +1152,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value ) for ( i = 0; attrs[i] != NULL; i++ ) { an[j].an_desc = NULL; an[j].an_oc = NULL; - an[j].an_oc_exclude = 0; + an[j].an_flags = 0; an[j].an_name.bv_val = attrs[i]; an[j].an_name.bv_len = strlen( attrs[i] ); if ( slap_bv2ad( &an[j].an_name, &an[j].an_desc, &pb->pb_rs->sr_text ) == LDAP_SUCCESS ) {