- BerVarray defref = be->be_update_refs
- ? be->be_update_refs : default_referral;
- BerVarray ref = referral_rewrite( defref,
- NULL, &pdn, LDAP_SCOPE_DEFAULT );
-
- send_ldap_result( conn, op, rc = LDAP_REFERRAL, NULL, NULL,
- ref ? ref : defref, NULL );
-
- ber_bvarray_free( ref );
+ BerVarray defref = NULL;
+ if ( !LDAP_STAILQ_EMPTY( &op->o_bd->be_syncinfo )) {
+ syncinfo_t *si;
+ LDAP_STAILQ_FOREACH( si, &op->o_bd->be_syncinfo, si_next ) {
+ struct berval tmpbv;
+ ber_dupbv( &tmpbv, &si->si_provideruri_bv[0] );
+ ber_bvarray_add( &defref, &tmpbv );
+ }
+ } else {
+ defref = op->o_bd->be_update_refs
+ ? op->o_bd->be_update_refs : default_referral;
+ }
+ if ( defref != NULL ) {
+ rs->sr_ref = referral_rewrite( defref,
+ NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
+ if (!rs->sr_ref) rs->sr_ref = defref;
+
+ rs->sr_err = LDAP_REFERRAL;
+ send_ldap_result( op, rs );
+
+ if (rs->sr_ref != defref) ber_bvarray_free( rs->sr_ref );
+ } else {
+ send_ldap_error( op, rs,
+ LDAP_UNWILLING_TO_PERFORM,
+ "referral missing" );
+ }