From: Quanah Gibson-Mount Date: Mon, 9 Mar 2009 20:35:16 +0000 (+0000) Subject: ITS#6006 X-Git-Tag: OPENLDAP_REL_ENG_2_4_16~41 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e3fb5d2f7b97133c7965ac6ab3f10aa5ef64f84f;p=openldap ITS#6006 --- diff --git a/CHANGES b/CHANGES index 4942a4a704..40051f16e7 100644 --- 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) diff --git a/servers/slapd/back-bdb/init.c b/servers/slapd/back-bdb/init.c index c92ebcef44..02ab2271de 100644 --- a/servers/slapd/back-bdb/init.c +++ b/servers/slapd/back-bdb/init.c @@ -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; diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c index c6e3cd03f6..847208c841 100644 --- a/servers/slapd/back-bdb/modify.c +++ b/servers/slapd/back-bdb/modify.c @@ -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;