From: Howard Chu Date: Thu, 5 Oct 2017 21:13:39 +0000 (+0100) Subject: ITS#8752 fix syncrepl null_callback X-Git-Tag: OPENLDAP_REL_ENG_2_4_46~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a86b1bf233de5fc722ac3cdea1113409c934e1bf;p=thirdparty%2Fopenldap.git ITS#8752 fix syncrepl null_callback Make sure it's last in callback stack --- diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 7c0a94eca2..cba7be1f77 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -157,7 +157,6 @@ static int syncrepl_op_modify( Operation *op, SlapReply *rs ); /* callback functions */ static int dn_callback( Operation *, SlapReply * ); static int nonpresent_callback( Operation *, SlapReply * ); -static int null_callback( Operation *, SlapReply * ); static AttributeDescription *sync_descs[4]; @@ -2243,6 +2242,34 @@ syncrepl_op_modify( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } +static int +syncrepl_null_callback( + Operation *op, + SlapReply *rs ) +{ + /* If we're not the last callback in the chain, move to the end */ + if ( op->o_callback->sc_next ) { + slap_callback **sc, *s1; + s1 = op->o_callback; + op->o_callback = op->o_callback->sc_next; + for ( sc = &op->o_callback; *sc; sc = &(*sc)->sc_next ) ; + *sc = s1; + s1->sc_next = NULL; + return SLAP_CB_CONTINUE; + } + if ( rs->sr_err != LDAP_SUCCESS && + rs->sr_err != LDAP_REFERRAL && + rs->sr_err != LDAP_ALREADY_EXISTS && + rs->sr_err != LDAP_NO_SUCH_OBJECT && + rs->sr_err != LDAP_NOT_ALLOWED_ON_NONLEAF ) + { + Debug( LDAP_DEBUG_ANY, + "syncrepl_null_callback : error code 0x%x\n", + rs->sr_err, 0, 0 ); + } + return LDAP_SUCCESS; +} + static int syncrepl_message_to_op( syncinfo_t *si, @@ -2254,7 +2281,7 @@ syncrepl_message_to_op( Modifications *modlist = NULL; logschema *ls; SlapReply rs = { REP_RESULT }; - slap_callback cb = { NULL, null_callback, NULL, NULL }; + slap_callback cb = { NULL, syncrepl_null_callback, NULL, NULL }; const char *text; char txtbuf[SLAP_TEXT_BUFLEN]; @@ -2969,7 +2996,7 @@ syncrepl_entry( slap_sl_free( op->ors_filterstr.bv_val, op->o_tmpmemctx ); } - cb.sc_response = null_callback; + cb.sc_response = syncrepl_null_callback; cb.sc_private = si; if ( entry && !BER_BVISNULL( &entry->e_name ) ) { @@ -3372,7 +3399,7 @@ retry_modrdn:; op->o_delete_glue_parent = 0; if ( !be_issuffix( be, &op->o_req_ndn ) ) { slap_callback cb = { NULL }; - cb.sc_response = slap_null_cb; + cb.sc_response = syncrepl_null_callback; dnParent( &op->o_req_ndn, &pdn ); op->o_req_dn = pdn; op->o_req_ndn = pdn; @@ -3570,7 +3597,7 @@ syncrepl_del_nonpresent( np_list = LDAP_LIST_NEXT( np_list, npe_link ); op->o_tag = LDAP_REQ_DELETE; op->o_callback = &cb; - cb.sc_response = null_callback; + cb.sc_response = syncrepl_null_callback; cb.sc_private = si; op->o_req_dn = *np_prev->npe_name; op->o_req_ndn = *np_prev->npe_nname; @@ -3612,7 +3639,7 @@ syncrepl_del_nonpresent( op->o_delete_glue_parent = 0; if ( !be_issuffix( be, &op->o_req_ndn ) ) { slap_callback cb = { NULL }; - cb.sc_response = slap_null_cb; + cb.sc_response = syncrepl_null_callback; dnParent( &op->o_req_ndn, &pdn ); op->o_req_dn = pdn; op->o_req_ndn = pdn; @@ -3665,7 +3692,7 @@ syncrepl_add_glue_ancestors( op->o_tag = LDAP_REQ_ADD; op->o_callback = &cb; - cb.sc_response = null_callback; + cb.sc_response = syncrepl_null_callback; cb.sc_private = NULL; dn = e->e_name; @@ -3807,7 +3834,7 @@ syncrepl_add_glue( op->o_tag = LDAP_REQ_ADD; op->o_callback = &cb; - cb.sc_response = null_callback; + cb.sc_response = syncrepl_null_callback; cb.sc_private = NULL; op->o_req_dn = e->e_name; @@ -3919,7 +3946,7 @@ syncrepl_updateCookie( op->o_tag = LDAP_REQ_MODIFY; - cb.sc_response = null_callback; + cb.sc_response = syncrepl_null_callback; cb.sc_private = si; op->o_callback = &cb; @@ -4412,24 +4439,6 @@ nonpresent_callback( return LDAP_SUCCESS; } -static int -null_callback( - Operation* op, - SlapReply* rs ) -{ - if ( rs->sr_err != LDAP_SUCCESS && - rs->sr_err != LDAP_REFERRAL && - rs->sr_err != LDAP_ALREADY_EXISTS && - rs->sr_err != LDAP_NO_SUCH_OBJECT && - rs->sr_err != LDAP_NOT_ALLOWED_ON_NONLEAF ) - { - Debug( LDAP_DEBUG_ANY, - "null_callback : error code 0x%x\n", - rs->sr_err, 0, 0 ); - } - return LDAP_SUCCESS; -} - static struct berval * slap_uuidstr_from_normalized( struct berval* uuidstr,