Blame SOURCES/slapi-0006-back-sch-do-not-clobber-target-of-the-pblock-for-idv.patch

01d2b2
From b59b9c87042cb8f4d99421e101349c5f48f91235 Mon Sep 17 00:00:00 2001
01d2b2
From: Alexander Bokovoy <abokovoy@redhat.com>
01d2b2
Date: Tue, 26 Jul 2016 18:11:53 +0300
01d2b2
Subject: [PATCH 6/8] back-sch: do not clobber target of the pblock for idview
01d2b2
01d2b2
When extracting idview all we care is the DN of new target.
01d2b2
We don't really use the rewritten target as a string anymore,
01d2b2
so there is no need to rewrite the string in the pblock.
01d2b2
01d2b2
This fixes a bug when running with 389-ds 1.3.5.10+ which is more
01d2b2
strict about modification of the values in pblock.
01d2b2
01d2b2
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1360245
01d2b2
---
01d2b2
 src/back-sch.c | 43 ++++++++++++++++++++++---------------------
01d2b2
 src/back-sch.h |  2 +-
01d2b2
 2 files changed, 23 insertions(+), 22 deletions(-)
01d2b2
01d2b2
diff --git a/src/back-sch.c b/src/back-sch.c
01d2b2
index 0745329..e15988f 100644
01d2b2
--- a/src/back-sch.c
01d2b2
+++ b/src/back-sch.c
01d2b2
@@ -1652,6 +1652,8 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 	struct backend_search_cbdata cbdata;
01d2b2
 	struct backend_staged_search *staged, *next;
01d2b2
 	int i, isroot, ret;
01d2b2
+	char *original_target = NULL;
01d2b2
+	char *target = NULL;
01d2b2
 
01d2b2
 	if (wrap_get_call_level() > 0) {
01d2b2
 		return 0;
01d2b2
@@ -1676,7 +1678,7 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 		return 0;
01d2b2
 	}
01d2b2
 
01d2b2
-	slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &cbdata.target);
01d2b2
+	slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &original_target);
01d2b2
 	slapi_pblock_get(pb, SLAPI_SEARCH_SCOPE, &cbdata.scope);
01d2b2
 	slapi_pblock_get(pb, SLAPI_SEARCH_SIZELIMIT, &cbdata.sizelimit);
01d2b2
 	slapi_pblock_get(pb, SLAPI_SEARCH_TIMELIMIT, &cbdata.timelimit);
01d2b2
@@ -1697,15 +1699,15 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 	/* Okay, we can search. */
01d2b2
 	slapi_log_error(SLAPI_LOG_PLUGIN, cbdata.state->plugin_desc->spd_id,
01d2b2
 			"searching from \"%s\" for \"%s\" with scope %d%s\n",
01d2b2
-			cbdata.target, cbdata.strfilter, cbdata.scope,
01d2b2
+			original_target, cbdata.strfilter, cbdata.scope,
01d2b2
 			backend_sch_scope_as_string(cbdata.scope));
01d2b2
-	cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
01d2b2
+	cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
01d2b2
 	/* Check if there's a backend handling this search. */
01d2b2
 	if (!slapi_be_exist(cbdata.target_dn)) {
01d2b2
 		slapi_log_error(SLAPI_LOG_PLUGIN,
01d2b2
 				cbdata.state->plugin_desc->spd_id,
01d2b2
 				"slapi_be_exists(\"%s\") = 0, "
01d2b2
-				"ignoring search\n", cbdata.target);
01d2b2
+				"ignoring search\n", original_target);
01d2b2
 		slapi_sdn_free(&cbdata.target_dn);
01d2b2
 		return 0;
01d2b2
 	}
01d2b2
@@ -1716,22 +1718,23 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 	 * detect the ID view use. Unless the ID view is within the set we control, don't consider the override */
01d2b2
 	map_data_foreach_domain(cbdata.state, backend_search_find_set_dn_cb, &cbdata);
01d2b2
 	if (cbdata.answer == FALSE) {
01d2b2
-		idview_replace_target_dn(&cbdata.target, &cbdata.idview);
01d2b2
+		target = slapi_ch_strdup(original_target);
01d2b2
+		idview_replace_target_dn(&target, &cbdata.idview);
01d2b2
 		if (cbdata.idview != NULL) {
01d2b2
 			slapi_sdn_free(&cbdata.target_dn);
01d2b2
 			/* Perform another check, now for rewritten DN */
01d2b2
-			cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
01d2b2
+			cbdata.target_dn = slapi_sdn_new_dn_byval(target);
01d2b2
 			map_data_foreach_domain(cbdata.state, backend_search_find_set_dn_cb, &cbdata);
01d2b2
 			/* Rewritten DN might still be outside of our trees */
01d2b2
 			if (cbdata.answer == TRUE) {
01d2b2
 				slapi_log_error(SLAPI_LOG_PLUGIN, cbdata.state->plugin_desc->spd_id,
01d2b2
 						"Use of ID view '%s' is detected, searching from \"%s\" "
01d2b2
 						"for \"%s\" with scope %d%s. Filter may get overridden later.\n",
01d2b2
-						cbdata.idview, cbdata.target, cbdata.strfilter, cbdata.scope,
01d2b2
+						cbdata.idview, target, cbdata.strfilter, cbdata.scope,
01d2b2
 						backend_sch_scope_as_string(cbdata.scope));
01d2b2
 			} else {
01d2b2
 				slapi_sdn_free(&cbdata.target_dn);
01d2b2
-				slapi_ch_free_string(&cbdata.target);
01d2b2
+				slapi_ch_free_string(&target);
01d2b2
 				slapi_ch_free_string(&cbdata.idview);
01d2b2
 				slapi_log_error(SLAPI_LOG_PLUGIN,
01d2b2
 						cbdata.state->plugin_desc->spd_id,
01d2b2
@@ -1739,6 +1742,8 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 						"ignoring search\n");
01d2b2
 				return 0;
01d2b2
 			}
01d2b2
+		} else {
01d2b2
+			slapi_ch_free_string(&target);
01d2b2
 		}
01d2b2
 	}
01d2b2
 	cbdata.answer = FALSE;
01d2b2
@@ -1890,7 +1895,7 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 	}
01d2b2
 	slapi_sdn_free(&cbdata.target_dn);
01d2b2
 	if (cbdata.idview != NULL) {
01d2b2
-		slapi_ch_free_string(&cbdata.target);
01d2b2
+		slapi_ch_free_string(&target);
01d2b2
 	}
01d2b2
 	slapi_ch_free_string(&cbdata.idview);
01d2b2
 #ifdef USE_IPA_IDVIEWS
01d2b2
@@ -1904,7 +1909,6 @@ backend_search_cb(Slapi_PBlock *pb)
01d2b2
 /* Locate the entry for a given DN. */
01d2b2
 struct backend_locate_cbdata {
01d2b2
 	struct plugin_state *state;
01d2b2
-	char *target;
01d2b2
 	Slapi_DN *target_dn;
01d2b2
 
01d2b2
 	struct backend_entry_data *entry_data;
01d2b2
@@ -1953,6 +1957,7 @@ static void
01d2b2
 backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **group, const char**set)
01d2b2
 {
01d2b2
 	struct backend_locate_cbdata cbdata;
01d2b2
+	char *original_target = NULL;
01d2b2
 
01d2b2
 	slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &cbdata.state);
01d2b2
 	if (cbdata.state->plugin_base == NULL) {
01d2b2
@@ -1960,9 +1965,9 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
01d2b2
 		*data = NULL;
01d2b2
 		return;
01d2b2
 	}
01d2b2
-	slapi_pblock_get(pb, SLAPI_TARGET_DN, &cbdata.target);
01d2b2
+	slapi_pblock_get(pb, SLAPI_TARGET_DN, &original_target);
01d2b2
 
01d2b2
-	cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
01d2b2
+	cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
01d2b2
 	cbdata.entry_data = NULL;
01d2b2
 	cbdata.entry_group = NULL;
01d2b2
 	cbdata.entry_set = NULL;
01d2b2
@@ -1972,12 +1977,9 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
01d2b2
 	 * rebuild the target's RDN to use original attribute's value */
01d2b2
 	if (cbdata.entry_data == NULL) {
01d2b2
 		char *idview = NULL;
01d2b2
-		char *target, *original_target;
01d2b2
-		target = original_target = slapi_ch_strdup(cbdata.target);
01d2b2
+		char *target = NULL;
01d2b2
+		target = slapi_ch_strdup(original_target);
01d2b2
 		idview_replace_target_dn(&target, &idview);
01d2b2
-		if (target != original_target) {
01d2b2
-			slapi_ch_free_string(&original_target);
01d2b2
-		}
01d2b2
 		if (idview != NULL) {
01d2b2
 			char *rdnstr;
01d2b2
 			char *val;
01d2b2
@@ -1992,7 +1994,6 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
01d2b2
 					bval.bv_val = slapi_ch_strdup(val);
01d2b2
 					memset(&scbdata, 0, sizeof(scbdata));
01d2b2
 					scbdata.idview = idview;
01d2b2
-					scbdata.target = target;
01d2b2
 					scbdata.pb = pb;
01d2b2
 					scbdata.state = cbdata.state;
01d2b2
 					scbdata.target_dn = slapi_sdn_new_dn_byval(target);
01d2b2
@@ -2025,7 +2026,6 @@ backend_locate(Slapi_PBlock *pb, struct backend_entry_data **data, const char **
01d2b2
  * insufficient-access error. */
01d2b2
 struct backend_group_check_scope_cbdata {
01d2b2
 	struct plugin_state *state;
01d2b2
-	const char *target;
01d2b2
 	Slapi_DN *target_dn;
01d2b2
 	bool_t ours;
01d2b2
 };
01d2b2
@@ -2050,14 +2050,15 @@ static bool_t
01d2b2
 backend_check_scope_pb(Slapi_PBlock *pb)
01d2b2
 {
01d2b2
 	struct backend_group_check_scope_cbdata cbdata;
01d2b2
+	char *original_target = NULL;
01d2b2
 
01d2b2
 	slapi_pblock_get(pb, SLAPI_PLUGIN_PRIVATE, &cbdata.state);
01d2b2
 	if (cbdata.state->plugin_base == NULL) {
01d2b2
 		/* The plugin was not actually started. */
01d2b2
 		return FALSE;
01d2b2
 	}
01d2b2
-	slapi_pblock_get(pb, SLAPI_TARGET_DN, &cbdata.target);
01d2b2
-	cbdata.target_dn = slapi_sdn_new_dn_byval(cbdata.target);
01d2b2
+	slapi_pblock_get(pb, SLAPI_TARGET_DN, &original_target);
01d2b2
+	cbdata.target_dn = slapi_sdn_new_dn_byval(original_target);
01d2b2
 	cbdata.ours = FALSE;
01d2b2
 	map_data_foreach_domain(cbdata.state, backend_group_check_scope_cb,
01d2b2
 				&cbdata);
01d2b2
diff --git a/src/back-sch.h b/src/back-sch.h
01d2b2
index 1258ae0..9a9abc7 100644
01d2b2
--- a/src/back-sch.h
01d2b2
+++ b/src/back-sch.h
01d2b2
@@ -88,7 +88,7 @@ struct entries_to_send {
01d2b2
 struct backend_search_cbdata {
01d2b2
 	Slapi_PBlock *pb;
01d2b2
 	struct plugin_state *state;
01d2b2
-	char *target, *strfilter, **attrs;
01d2b2
+	char *strfilter, **attrs;
01d2b2
 	char *idview;
01d2b2
 	Slapi_Entry **overrides;
01d2b2
 	int scope, sizelimit, timelimit, attrsonly;
01d2b2
-- 
01d2b2
2.7.4
01d2b2