--- servers/slapd/back-ldap/chain.c 2010/04/13 20:18:14 1.76 +++ servers/slapd/back-ldap/chain.c 2010/04/15 16:13:54 1.77 @@ -1,5 +1,5 @@ /* chain.c - chain LDAP operations */ -/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.75 2010/04/11 22:08:11 ando Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.76 2010/04/13 20:18:14 kurt Exp $ */ /* This work is part of OpenLDAP Software . * * Copyright 2003-2010 The OpenLDAP Foundation. @@ -854,6 +854,7 @@ ldap_chain_response( Operation *op, Slap /* we need this to know if back-ldap returned any result */ lb.lb_lc = lc; + sc2.sc_next = sc->sc_next; sc2.sc_private = &lb; sc2.sc_response = ldap_chain_cb_response; op->o_callback = &sc2; @@ -947,6 +948,7 @@ ldap_chain_response( Operation *op, Slap case LDAP_SUCCESS: case LDAP_REFERRAL: + sr_err = rs->sr_err; /* slapd-ldap sent response */ if ( !op->o_abandon && lb.lb_status != LDAP_CH_RES ) { /* FIXME: should we send response? */ @@ -974,7 +976,7 @@ cannot_chain:; default: #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */ if ( LDAP_CHAIN_RETURN_ERR( lc ) ) { - rs->sr_err = rc; + sr_err = rs->sr_err = rc; rs->sr_type = sr_type; } else { @@ -992,7 +994,8 @@ cannot_chain:; } if ( lb.lb_status == LDAP_CH_NONE && rc != SLAPD_ABANDON ) { - op->o_callback = NULL; + /* give the remaining callbacks a chance */ + op->o_callback = sc->sc_next; rc = rs->sr_err = slap_map_api2result( rs ); send_ldap_result( op, rs ); }