[Date Prev][Date Next] [Chronological] [Thread] [Top]

Re: (ITS#7636) slapd crash when multi-master replication (syncrepl) enabled



------=_20130709125114_66017
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

I have traced the fault into the syncrepl overlay, specifically it passes
a static global variable to be_search().  If a plugin is configured,
slapi_op_search_callback() is called, which then attempts to free the
static global search variable passed to be_search(), causing a crash.

The attached patch fixes the problem on my test system.
------=_20130709125114_66017
Content-Type: text/x-patch; name="openldap_syncprov_plugin_crash_fix.diff"
Content-Transfer-Encoding: 8bit
Content-Disposition: attachment;
  filename="openldap_syncprov_plugin_crash_fix.diff"

--- servers/slapd/overlays/syncprov.c
+++ servers/slapd/overlays/syncprov.c
@@ -460,7 +460,13 @@
 		fop.ors_attrs = slap_anlist_no_attrs;
 		fop.ors_attrsonly = 1;
 		fop.ors_filter = &generic_filter;
-		fop.ors_filterstr = generic_filterstr;
+
+		// If any plugins are enabled, slapi_overlay will attempt to free the provided filter string in slapi_op_search_callback, causing a crash
+		// Therefore, allocate a copy of generic_filterstr for use by be_search()
+		struct berval filterstr;
+		filterstr.bv_len = generic_filterstr.bv_len;
+		filterstr.bv_val = op->o_tmpalloc(generic_filterstr.bv_len + 1, op->o_tmpmemctx);
+		memcpy(filterstr.bv_val, generic_filterstr.bv_val, generic_filterstr.bv_len + 1);
 
 		rc = fop.o_bd->be_search( &fop, &frs );
 	} else {
------=_20130709125114_66017--