From 6beb139e61811a36ce6cdecf0a95f416c826040c Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Thu, 18 Mar 2004 23:38:55 +0000 Subject: [PATCH] fix nasty subtype bug (too many results) --- servers/slapd/back-sql/entry-id.c | 20 ++++++++++++++++++++ servers/slapd/back-sql/schema-map.c | 19 +++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/servers/slapd/back-sql/entry-id.c b/servers/slapd/back-sql/entry-id.c index e1644e2f40..55a4f55d7c 100644 --- a/servers/slapd/back-sql/entry-id.c +++ b/servers/slapd/back-sql/entry-id.c @@ -398,6 +398,24 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid ) continue; } + /* if one of the attributes listed here is + * a subtype of another, it must be ignored, + * because subtypes are already dealt with + * by backsql_supad2at() + */ + for ( j = 0; bsi->bsi_attrs[ j ].an_name.bv_val; j++ ) { + /* skip self */ + if ( j == i ) { + continue; + } + + /* skip subtypes */ + if ( is_at_subtype( attr->an_desc->ad_type, bsi->bsi_attrs[ j ].an_desc->ad_type ) ) + { + goto next; + } + } + rc = backsql_supad2at( bsi->bsi_oc, attr->an_desc, &vat ); if ( rc != 0 || vat == NULL ) { Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(): " @@ -413,6 +431,8 @@ backsql_id2entry( backsql_srch_info *bsi, Entry *e, backsql_entryID *eid ) } ch_free( vat ); + +next:; } } else { diff --git a/servers/slapd/back-sql/schema-map.c b/servers/slapd/back-sql/schema-map.c index 092a0750f9..1de778c5c6 100644 --- a/servers/slapd/back-sql/schema-map.c +++ b/servers/slapd/back-sql/schema-map.c @@ -595,8 +595,23 @@ supad2at_f( void *v_at, void *v_arg ) if ( is_at_subtype( at->bam_ad->ad_type, va->ad->ad_type ) ) { backsql_at_map_rec **ret; + unsigned i; + + /* if already listed, holler! (should never happen) */ + if ( va->ret ) { + for ( i = 0; i < va->n; i++ ) { + if ( va->ret[ i ]->bam_ad == at->bam_ad ) { + break; + } + } + + if ( i < va->n ) { + return 0; + } + } - ret = ch_realloc( va->ret, sizeof( backsql_at_map_rec *) * ( va->n + 2 ) ); + ret = ch_realloc( va->ret, + sizeof( backsql_at_map_rec *) * ( va->n + 2 ) ); if ( ret == NULL ) { ch_free( va->ret ); return SUPAD2AT_STOP; @@ -632,7 +647,7 @@ backsql_supad2at( backsql_oc_map_rec *objclass, AttributeDescription *supad, va.ret = NULL; va.ad = supad; va.n = 0; - + rc = avl_apply( objclass->bom_attrs, supad2at_f, &va, SUPAD2AT_STOP, AVL_INORDER ); if ( rc == SUPAD2AT_STOP ) { -- 2.39.5