From: Quanah Gibson-Mount Date: Thu, 10 Jun 2010 19:25:01 +0000 (+0000) Subject: ITS#6549 X-Git-Tag: OPENLDAP_REL_ENG_2_4_23~24 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=e164298fe87956830d8eac60415e7be753c0b160;p=openldap ITS#6549 --- diff --git a/CHANGES b/CHANGES index 7ea6a594a2..3f4edb8428 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ OpenLDAP 2.4 Change Log OpenLDAP 2.4.23 Engineering Fixed liblutil off-by-one with delta (ITS#6541) Fixed slapd syncrepl rid logging (ITS#6533) + Fixed slapd-bdb hasSubordinates computation (ITS#6549) Fixed contrib/nssov network.c missing patch (ITS#6562) Documentation slapd-config(5) note default rootdn (ITS#6546) diff --git a/servers/slapd/back-bdb/operational.c b/servers/slapd/back-bdb/operational.c index 33b8f93784..36a0ed3973 100644 --- a/servers/slapd/back-bdb/operational.c +++ b/servers/slapd/back-bdb/operational.c @@ -39,6 +39,7 @@ bdb_hasSubordinates( OpExtra *oex; DB_TXN *rtxn; int rc; + int release = 0; assert( e != NULL ); @@ -48,7 +49,18 @@ bdb_hasSubordinates( * let's disable the hasSubordinate feature for back-relay. */ if ( BEI( e ) == NULL ) { - return LDAP_OTHER; + Entry *ee = NULL; + rc = be_entry_get_rw( op, &e->e_nname, NULL, NULL, 0, &ee ); + if ( rc != LDAP_SUCCESS || ee == NULL ) { + rc = LDAP_OTHER; + goto done; + } + e = ee; + release = 1; + if ( BEI( ee ) == NULL ) { + rc = LDAP_OTHER; + goto done; + } } /* Check for a txn in a parent op, otherwise use reader txn */ @@ -61,7 +73,10 @@ bdb_hasSubordinates( rtxn = opinfo->boi_txn; } else { rc = bdb_reader_get(op, bdb->bi_dbenv, &rtxn); - if ( rc ) return LDAP_OTHER; + if ( rc ) { + rc = LDAP_OTHER; + goto done; + } } retry: @@ -92,6 +107,8 @@ retry: rc = LDAP_OTHER; } +done:; + if ( release && e != NULL ) be_entry_release_r( op, e ); return rc; }