]> git.sur5r.net Git - openldap/commitdiff
ITS#6506
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 15 Apr 2010 22:10:03 +0000 (22:10 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 15 Apr 2010 22:10:03 +0000 (22:10 +0000)
CHANGES
servers/slapd/backglue.c

diff --git a/CHANGES b/CHANGES
index 908aea803277c39ffc923480f4f766f213b38ea3..8185e2655cb3f9e25d838b229ad93ccd73eaa717 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,7 @@ OpenLDAP 2.4.22 Engineering
        Fixed slapd acl non-entry internal searches (ITS#6481)
        Fixed slapd certificateListValidate (ITS#6466)
        Fixed slapd empty URI parsing (ITS#6465)
+       Fixed slapd glued misplaced entries (ITS#6506)
        Fixed slapd glued paged results (ITS#6504)
        Fixed slapd ignore controls with unrecognized flags (ITS#6480)
        Fixed slapd REP_ENTRY flag handling (ITS#5340)
index f1ec215c1c47a0684a09a5ef0ca15e61909f9a6c..cf9fffd0238be9280aa839f77e6f17ff005d629f 100644 (file)
@@ -56,6 +56,8 @@ static BackendDB *glueBack;
 static BackendDB glueBackDone;
 #define GLUEBACK_DONE (&glueBackDone)
 
+static slap_overinst * glue_tool_inst( BackendInfo *bi);
+
 static slap_response glue_op_response;
 
 /* Just like select_backend, but only for our backends */
@@ -619,6 +621,49 @@ glue_tool_entry_open (
        toolDB = *b0;
        toolDB.bd_info = oi->oi_orig;
 
+       /* Sanity checks */
+       {
+               slap_overinst *on = glue_tool_inst( b0->bd_info );
+               glueinfo        *gi = on->on_bi.bi_private;
+
+               int i;
+               for (i = 0; i < gi->gi_nodes; i++) {
+                       BackendDB *bd;
+                       struct berval pdn;
+       
+                       dnParent( &gi->gi_n[i].gn_be->be_nsuffix[0], &pdn );
+                       bd = select_backend( &pdn, 0 );
+                       if ( bd ) {
+                               ID id;
+                               BackendDB db;
+       
+                               if ( overlay_is_over( bd ) ) {
+                                       slap_overinfo *oi = (slap_overinfo *)bd->bd_info;
+                                       db = *bd;
+                                       db.bd_info = oi->oi_orig;
+                                       bd = &db;
+                               }
+       
+                               if ( !bd->bd_info->bi_tool_dn2id_get
+                                       || !bd->bd_info->bi_tool_entry_open
+                                       || !bd->bd_info->bi_tool_entry_close )
+                               {
+                                       continue;
+                               }
+       
+                               bd->bd_info->bi_tool_entry_open( bd, 0 );
+                               id = bd->bd_info->bi_tool_dn2id_get( bd, &gi->gi_n[i].gn_be->be_nsuffix[0] );
+                               bd->bd_info->bi_tool_entry_close( bd );
+                               if ( id != NOID ) {
+                                       Debug( LDAP_DEBUG_ANY,
+                                               "glue_tool_entry_open: subordinate database suffix entry DN=\"%s\" also present in superior database rooted at DN=\"%s\"\n",
+                                               gi->gi_n[i].gn_be->be_suffix[0].bv_val, bd->be_suffix[0].bv_val, 0 );
+                                       return LDAP_OTHER;
+                               }
+                       }
+               }
+       }
+       
        return 0;
 }