This is a multi-part message in MIME format. --------------090107030705000509000908 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit
[email protected] wrote: > Unfortunately the previous patch only fixes some of the most obvious > (immediate) crashes. There are other places in the code (e.g. syncprov.c > line 647) which pass non-malloc()ed variables to be_search() and thereby > crash slapd. > > Has syncrepl even been tested with plugins before? We really wanted to > use OpenLDAP for our directory server, however if replication cannot be > used with plugins then we may need to go with a Microsoft solution > instead. > > Any hints? Somewhat of a workaround - slapi should not be doing anything here unless the filter was actually changed. syncprov is using (objectclass=*) which frankly no plugin should be rewriting, so this will cover it for the most part. Aside from that it looks like this area of the slapi interaction needs some redesign. -- -- Howard Chu CTO, Symas Corp. http://www.symas.com Director, Highland Sun http://highlandsun.com/hyc/ Chief Architect, OpenLDAP http://www.openldap.org/project/ --------------090107030705000509000908 Content-Type: text/plain; charset=UTF-8; name="diff.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="diff.txt" diff --git a/servers/slapd/slapi/slapi_overlay.c b/servers/slapd/slapi/slapi_overlay.c index 0db4ce2..ad23153 100644 --- a/servers/slapd/slapi/slapi_overlay.c +++ b/servers/slapd/slapi/slapi_overlay.c @@ -296,6 +296,7 @@ static int slapi_op_search_callback( Operation *op, SlapReply *rs, int prc ) { Slapi_PBlock *pb = SLAPI_OPERATION_PBLOCK( op ); + Filter *f = op->ors_filter; /* check preoperation result code */ if ( prc < 0 ) { @@ -310,8 +311,10 @@ slapi_op_search_callback( Operation *op, SlapReply *rs, int prc ) * The plugin can set the SLAPI_SEARCH_FILTER. * SLAPI_SEARCH_STRFILER is not normative. */ - op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx ); - filter2bv_x( op, op->ors_filter, &op->ors_filterstr ); + if (f != op->ors_filter) { + op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx ); + filter2bv_x( op, op->ors_filter, &op->ors_filterstr ); + } } return LDAP_SUCCESS; --------------090107030705000509000908--
