]> git.sur5r.net Git - openldap/commitdiff
Import ITS#3267 fix from HEAD
authorHoward Chu <hyc@openldap.org>
Thu, 21 Apr 2005 10:25:12 +0000 (10:25 +0000)
committerHoward Chu <hyc@openldap.org>
Thu, 21 Apr 2005 10:25:12 +0000 (10:25 +0000)
servers/slapd/back-bdb/tools.c

index b01c4d7d968966bdd483d8bfb5c89be824f9c398..b4a83aa4e6e68463a6f89fca8ccc3e9bf548b616 100644 (file)
@@ -203,7 +203,7 @@ static int bdb_tool_next_id(
        struct berval dn = e->e_name;
        struct berval ndn = e->e_nname;
        struct berval pdn, npdn;
-       EntryInfo *ei = NULL;
+       EntryInfo *ei = NULL, eidummy;
        int rc;
 
        if (ndn.bv_len == 0) return 0;
@@ -212,6 +212,7 @@ static int bdb_tool_next_id(
        if ( ei ) bdb_cache_entryinfo_unlock( ei );
        if ( rc == DB_NOTFOUND ) {
                if ( !be_issuffix( op->o_bd, &ndn ) ) {
+                       ID eid = e->e_id;
                        dnParent( &dn, &pdn );
                        dnParent( &ndn, &npdn );
                        e->e_name = pdn;
@@ -222,6 +223,14 @@ static int bdb_tool_next_id(
                        if ( rc ) {
                                return rc;
                        }
+                       /* If parent didn't exist, it was created just now
+                        * and its ID is now in e->e_id. Make sure the current
+                        * entry gets added under the new parent ID.
+                        */
+                       if ( eid != e->e_id ) {
+                               eidummy.bei_id = e->e_id;
+                               ei = &eidummy;
+                       }
                }
                rc = bdb_next_id( op->o_bd, tid, &e->e_id );
                if ( rc ) {