]> git.sur5r.net Git - openldap/commitdiff
ITS#6006
authorQuanah Gibson-Mount <quanah@openldap.org>
Mon, 9 Mar 2009 20:35:16 +0000 (20:35 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 9 Mar 2009 20:35:16 +0000 (20:35 +0000)
CHANGES
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/modify.c

diff --git a/CHANGES b/CHANGES
index 4942a4a7045658aef79440457860f0aad7783d7c..40051f16e70ff5a46455c9209961c45c84aa89cd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,7 @@ OpenLDAP 2.4.16 Engineering
        Fixed slapd syncrepl newCookie sync messages (ITS#5972)
        Fixed slapd syncrepl multiple CSN propagation (ITS#5973)
        Fixed slapd-bdb/hdb cachesize handling (ITS#5860)
+       Fixed slapd-bdb/hdb with slapcat with empty dn (ITS#6006)
        Fixed slapd-ldap incorrect referral handling (ITS#6003,ITS#5916)
        Fixed slapd-ldap/meta with broken AD results (ITS#5977)
        Fixed slapd-ldap/meta with invalid attrs again (ITS#5959)
index c92ebcef445f08c02608e6d4f38efbcae4d6bdaa..02ab2271de60d9804a9b80f1e5287096541ada8d 100644 (file)
@@ -537,10 +537,23 @@ shm_retry:
                rc = bdb_id2entry( be, NULL, 0, &e );
        }
        if ( !e ) {
+               struct berval gluebv = BER_BVC("glue");
+               Operation op = {0};
+               Opheader ohdr = {0};
                e = entry_alloc();
                e->e_id = 0;
                ber_dupbv( &e->e_name, (struct berval *)&slap_empty_bv );
                ber_dupbv( &e->e_nname, (struct berval *)&slap_empty_bv );
+               attr_merge_one( e, slap_schema.si_ad_objectClass,
+                       &gluebv, NULL );
+               attr_merge_one( e, slap_schema.si_ad_structuralObjectClass,
+                       &gluebv, NULL );
+               op.o_hdr = &ohdr;
+               op.o_bd = be;
+               op.ora_e = e;
+               op.o_dn = be->be_rootdn;
+               op.o_ndn = be->be_rootndn;
+               slap_add_opattrs( &op, NULL, NULL, 0, 0 );
        }
        e->e_ocflags = SLAP_OC_GLUE|SLAP_OC__END;
        e->e_private = &bdb->bi_cache.c_dntree;
index c6e3cd03f6d0494a12cd5a48df3d41b96586fcc9..847208c84165ae1fbe5efe58a5ddb94a5fdce804 100644 (file)
@@ -363,7 +363,6 @@ bdb_modify( Operation *op, SlapReply *rs )
        DB_TXN  *ltid = NULL, *lt2;
        struct bdb_op_info opinfo = {{{ 0 }}};
        Entry           dummy = {0};
-       int                     fakeroot = 0;
 
        DB_LOCK         lock;
 
@@ -487,19 +486,6 @@ retry:     /* transaction retry */
                case DB_LOCK_NOTGRANTED:
                        goto retry;
                case DB_NOTFOUND:
-                       if ( BER_BVISEMPTY( &op->o_req_ndn )) {
-                               struct berval gluebv = BER_BVC("glue");
-                               e = ch_calloc( 1, sizeof(Entry));
-                               e->e_name.bv_val = ch_strdup( "" );
-                               ber_dupbv( &e->e_nname, &e->e_name );
-                               attr_merge_one( e, slap_schema.si_ad_objectClass,
-                                       &gluebv, NULL );
-                               attr_merge_one( e, slap_schema.si_ad_structuralObjectClass,
-                                       &gluebv, NULL );
-                               e->e_private = ei;
-                               fakeroot = 1;
-                               rs->sr_err = 0;
-                       }
                        break;
                case LDAP_BUSY:
                        rs->sr_text = "ldap server busy";
@@ -511,9 +497,7 @@ retry:      /* transaction retry */
                }
        }
 
-       if ( !fakeroot ) {
-               e = ei->bei_e;
-       }
+       e = ei->bei_e;
 
        /* acquire and lock entry */
        /* FIXME: dn2entry() should return non-glue entry */
@@ -676,19 +660,11 @@ retry:    /* transaction retry */
        } else {
                /* may have changed in bdb_modify_internal() */
                e->e_ocflags = dummy.e_ocflags;
-               if ( fakeroot ) {
-                       e->e_private = NULL;
-                       entry_free( e );
-                       e = NULL;
-                       attrs_free( dummy.e_attrs );
-
-               } else {
-                       rc = bdb_cache_modify( bdb, e, dummy.e_attrs, ltid, &lock );
-                       switch( rc ) {
-                       case DB_LOCK_DEADLOCK:
-                       case DB_LOCK_NOTGRANTED:
-                               goto retry;
-                       }
+               rc = bdb_cache_modify( bdb, e, dummy.e_attrs, ltid, &lock );
+               switch( rc ) {
+               case DB_LOCK_DEADLOCK:
+               case DB_LOCK_NOTGRANTED:
+                       goto retry;
                }
                dummy.e_attrs = NULL;