]> git.sur5r.net Git - openldap/commitdiff
(ITS#6987) Consider only same attribute siblings for Cft_misc.
authorOndrej Kuznik <ondrej.kuznik@acision.com>
Fri, 9 Mar 2012 13:37:59 +0000 (14:37 +0100)
committerHoward Chu <hyc@openldap.org>
Tue, 27 Mar 2012 08:53:30 +0000 (01:53 -0700)
For all other ce_types it holds that each is represented by one
attribute, making ce_type matching for X-ORDERED siblings equivalent to
how back-ldif handles them. Cft_misc is means "all other types", however
no overlay/backend so far has used different attributes as siblings,
triggering the difference in handling between bconfig.c and back-ldif.

servers/slapd/bconfig.c

index ae2e76fd9233ccb0030e09c34e1bd0aaa62ff53b..c8ee29977f47a4a4a8181ba77a9b8aec7f7369be 100644 (file)
@@ -4766,9 +4766,42 @@ check_name_index( CfEntryInfo *parent, ConfigType ce_type, Entry *e,
                }
        }
 
-       /* count related kids */
-       for (nsibs=0, ce=parent->ce_kids; ce; ce=ce->ce_sibs) {
-               if ( ce->ce_type == ce_type ) nsibs++;
+       /* count related kids, for entries of type Cft_Misc, consider only
+        * same attribute siblings */
+       if ( ce_type == Cft_Misc )
+       {
+               AttributeDescription *ad = NULL;
+
+               ptr1 = strchr( rdn.bv_val, '=' );
+               assert( ptr1 != NULL );
+
+               rdn.bv_len = ptr1 - rdn.bv_val;
+               slap_bv2ad( &rdn, &ad, &ptr2 );
+               assert( ad != NULL );
+
+               for (nsibs=0, ce=parent->ce_kids; ce; ce=ce->ce_sibs) {
+                       AttributeDescription *ad2 = NULL;
+                       if ( ce->ce_type != ce_type )
+                               continue;
+
+                       dnRdn( &ce->ce_entry->e_name, &rdn );
+
+                       ptr1 = strchr( rdn.bv_val, '=' );
+                       assert( ptr1 != NULL );
+
+                       rdn.bv_len = ptr1 - rdn.bv_val;
+                       slap_bv2ad( &rdn, &ad2, &ptr2 );
+                       assert( ad2 != NULL );
+
+                       if ( ad == ad2 )
+                               nsibs++;
+               }
+       }
+       else
+       {
+               for (nsibs=0, ce=parent->ce_kids; ce; ce=ce->ce_sibs) {
+                       if ( ce->ce_type == ce_type ) nsibs++;
+               }
        }
 
        /* account for -1 frontend */