assert( e );
+ /* NOTE: this should never happen, but it actually happens
+ * when using back-relay; until we find a better way to
+ * preserve entry's private information while rewriting it,
+ * let's disable the hasSubordinate feature for back-relay.
+ */
+ if ( BEI( e ) == NULL ) {
+ return LDAP_OTHER;
+ }
+
retry:
+ /* FIXME: we can no longer assume the entry's e_private
+ * field is correctly populated; so we need to reacquire
+ * it with reader lock */
rc = bdb_cache_children( op, NULL, e );
switch( rc ) {
int
bdb_operational(
Operation *op,
- SlapReply *rs,
- int opattrs,
- Attribute **a )
+ SlapReply *rs )
{
- Attribute **aa = a;
-
+ Attribute **ap;
+
assert( rs->sr_entry );
- if ( opattrs || ad_inlist( slap_schema.si_ad_hasSubordinates, rs->sr_attrs ) ) {
+ for ( ap = &rs->sr_operational_attrs; *ap; ap = &(*ap)->a_next )
+ /* just count */ ;
+
+ if ( SLAP_OPATTRS( rs->sr_attr_flags ) ||
+ ad_inlist( slap_schema.si_ad_hasSubordinates, rs->sr_attrs ) )
+ {
int hasSubordinates;
rs->sr_err = bdb_hasSubordinates( op, rs->sr_entry, &hasSubordinates );
if ( rs->sr_err == LDAP_SUCCESS ) {
- *aa = slap_operational_hasSubordinate( hasSubordinates == LDAP_COMPARE_TRUE );
- if ( *aa != NULL ) {
- aa = &(*aa)->a_next;
- }
+ *ap = slap_operational_hasSubordinate( hasSubordinates == LDAP_COMPARE_TRUE );
+ assert( *ap );
+
+ ap = &(*ap)->a_next;
}
}