From: Howard Chu Date: Wed, 13 Dec 2006 03:03:47 +0000 (+0000) Subject: Remainder of fix for ITS#4615 - stop processing overlay stack at glue X-Git-Tag: OPENLDAP_REL_ENG_2_4_4ALPHA~8^2~381 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f35a953a1401a7a5231bf43a5d7f1d2151df89d;p=thirdparty%2Fopenldap.git Remainder of fix for ITS#4615 - stop processing overlay stack at glue boundary --- diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index cce5905ee1..3f413d71fc 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -199,13 +199,26 @@ glue_op_func ( Operation *op, SlapReply *rs ) if ( func[which] ) rc = func[which]( op, rs ); else - rc = SLAP_CB_CONTINUE; + rc = SLAP_CB_BYPASS; op->o_bd = b0; op->o_bd->bd_info = bi0; return rc; } +static int +glue_response ( Operation *op, SlapReply *rs ) +{ + slap_overinst *on = (slap_overinst *)op->o_bd->bd_info; + BackendDB *be = op->o_bd; + be = glue_back_select (op->o_bd, &op->o_req_ndn); + + /* If we're on the master backend, let overlay framework handle it. + * Otherwise, bail out. + */ + return ( op->o_bd == be ) ? SLAP_CB_CONTINUE : SLAP_CB_BYPASS; +} + static int glue_chk_referrals ( Operation *op, SlapReply *rs ) { @@ -1012,6 +1025,7 @@ glue_sub_init() glue.on_bi.bi_chk_referrals = glue_chk_referrals; glue.on_bi.bi_chk_controls = glue_chk_controls; + glue.on_response = glue_response; return overlay_register( &glue ); } diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 3ffd188285..95673a88bc 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -238,6 +238,11 @@ over_back_response ( Operation *op, SlapReply *rs ) if ( rc != SLAP_CB_CONTINUE ) break; } } + /* Bypass the remaining on_response layers, but allow + * normal execution to continue. + */ + if ( rc == SLAP_CB_BYPASS ) + rc = SLAP_CB_CONTINUE; op->o_bd = be; return rc; } @@ -493,6 +498,8 @@ int overlay_op_walk( if ( rc != SLAP_CB_CONTINUE ) break; } } + if ( rc == SLAP_CB_BYPASS ) + rc = SLAP_CB_CONTINUE; func = &oi->oi_orig->bi_op_bind; if ( func[which] && rc == SLAP_CB_CONTINUE ) { diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index d42ebe665f..e985b78519 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2261,6 +2261,7 @@ typedef struct slap_overinfo { /* Should successive callbacks in a chain be processed? */ #define SLAP_CB_FREEME 0x04000 +#define SLAP_CB_BYPASS 0x08800 #define SLAP_CB_CONTINUE 0x08000 /*