]> git.sur5r.net Git - openldap/commitdiff
ITS#5986
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 5 Mar 2009 19:55:49 +0000 (19:55 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 5 Mar 2009 19:55:49 +0000 (19:55 +0000)
CHANGES
servers/slapd/backglue.c

diff --git a/CHANGES b/CHANGES
index b4b0ddca466aee0c066c6cad5dc92c14b2f53178..b15f903c4fafef37230ce96b4d3fd285a9e5fb33 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,7 @@ OpenLDAP 2.4.16 Engineering
        Fixed libldap GnuTLS TLSVerifyCilent try (ITS#5981)
        Fixed libldap segfault in checking cert/DN (ITS#5976)
        Fixed libldap peer cert memory leak again (ITS#5849)
+       Fixed slapd backglue with empty DBs (ITS#5986)
        Fixed slapd-bdb/hdb cachesize handling (ITS#5860)
        Fixed slapd-ldap/meta with broken AD results (ITS#5977)
        Fixed slapd-ldap/meta with invalid attrs again (ITS#5959)
index 4e8e094891e315528375cb0b9fd78b0477cd9da1..b3ca5d48322e997f3a384d0736eb455339b88b80 100644 (file)
@@ -52,6 +52,8 @@ static slap_overinst  glue;
 
 static int glueMode;
 static BackendDB *glueBack;
+static BackendDB glueBackDone;
+#define GLUEBACK_DONE (&glueBackDone)
 
 static slap_response glue_op_response;
 
@@ -591,7 +593,7 @@ glue_tool_entry_close (
 {
        int rc = 0;
 
-       if (glueBack) {
+       if (glueBack && glueBack != GLUEBACK_DONE) {
                if (!glueBack->be_entry_close)
                        return 0;
                rc = glueBack->be_entry_close (glueBack);
@@ -740,6 +742,7 @@ glue_tool_entry_first (
        slap_overinst   *on = glue_tool_inst( b0->bd_info );
        glueinfo                *gi = on->on_bi.bi_private;
        int i;
+       ID rc;
 
        /* If we're starting from scratch, start at the most general */
        if (!glueBack) {
@@ -759,7 +762,26 @@ glue_tool_entry_first (
                glueBack->be_entry_open (glueBack, glueMode) != 0)
                return NOID;
 
-       return glueBack->be_entry_first (glueBack);
+       rc = glueBack->be_entry_first (glueBack);
+       while ( rc == NOID ) {
+               if ( glueBack && glueBack->be_entry_close )
+                       glueBack->be_entry_close (glueBack);
+               for (i=0; i<gi->gi_nodes; i++) {
+                       if (gi->gi_n[i].gn_be == glueBack)
+                               break;
+               }
+               if (i == 0) {
+                       glueBack = GLUEBACK_DONE;
+                       break;
+               } else {
+                       glueBack = gi->gi_n[i-1].gn_be;
+                       rc = glue_tool_entry_first (b0);
+                       if ( glueBack == GLUEBACK_DONE ) {
+                               break;
+                       }
+               }
+       }
+       return rc;
 }
 
 static ID
@@ -786,11 +808,14 @@ glue_tool_entry_next (
                                break;
                }
                if (i == 0) {
-                       glueBack = NULL;
+                       glueBack = GLUEBACK_DONE;
                        break;
                } else {
                        glueBack = gi->gi_n[i-1].gn_be;
                        rc = glue_tool_entry_first (b0);
+                       if ( glueBack == GLUEBACK_DONE ) {
+                               break;
+                       }
                }
        }
        return rc;