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

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