svn commit: samba r12716 - in branches/SAMBA_4_0/source: dsdb/samdb/ldb_modules lib/ldb/modules

abartlet at samba.org abartlet at samba.org
Thu Jan 5 02:14:01 GMT 2006


Author: abartlet
Date: 2006-01-05 02:14:01 +0000 (Thu, 05 Jan 2006)
New Revision: 12716

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12716

Log:
Tridge points out that the request argument to ldb_next_request must
be a valid talloc() pointer, as other modules may rely on this.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/password_hash.c
   branches/SAMBA_4_0/source/lib/ldb/modules/objectclass.c


Changeset:
Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/password_hash.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/password_hash.c	2006-01-04 16:00:42 UTC (rev 12715)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/password_hash.c	2006-01-05 02:14:01 UTC (rev 12716)
@@ -91,9 +91,9 @@
 	struct ldb_dn *dn = msg->dn;
 	struct ldb_message *msg2;
 
-	struct ldb_request search_request;
-	struct ldb_request modify_request;
-	struct ldb_request modified_orig_request;
+	struct ldb_request *search_request = NULL;
+	struct ldb_request *modify_request;
+	struct ldb_request *modified_orig_request;
 	struct ldb_result *res, *dom_res, *old_res;
 
 	struct ldb_message_element *objectclasses;
@@ -132,17 +132,23 @@
 	}
 
 	if (req->operation == LDB_REQ_MODIFY) {
+		search_request = talloc(mem_ctx, struct ldb_request);
+		if (!search_request) {
+			talloc_free(mem_ctx);
+			return LDB_ERR_OPERATIONS_ERROR;
+		}
+
 		/* Look up the old ntPwdHash and lmPwdHash values, so
 		 * we can later place these into the password
 		 * history */
 
-		search_request.operation = LDB_REQ_SEARCH;
-		search_request.op.search.base = dn;
-		search_request.op.search.scope = LDB_SCOPE_BASE;
-		search_request.op.search.tree = ldb_parse_tree(module->ldb, NULL);
-		search_request.op.search.attrs = old_user_attrs;
+		search_request->operation = LDB_REQ_SEARCH;
+		search_request->op.search.base = dn;
+		search_request->op.search.scope = LDB_SCOPE_BASE;
+		search_request->op.search.tree = ldb_parse_tree(module->ldb, NULL);
+		search_request->op.search.attrs = old_user_attrs;
 		
-		old_ret = ldb_next_request(module, &search_request);
+		old_ret = ldb_next_request(module, search_request);
 	}
 
 	/* we can't change things untill we copy it */
@@ -180,18 +186,24 @@
 		unicodePwd = NULL;
 	}
 
-	modified_orig_request = *req;
-	switch (modified_orig_request.operation) {
+	modified_orig_request = talloc(mem_ctx, struct ldb_request);
+	if (!modified_orig_request) {
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	*modified_orig_request = *req;
+	switch (modified_orig_request->operation) {
 	case LDB_REQ_ADD:
-		modified_orig_request.op.add.message = msg2;
+		modified_orig_request->op.add.message = msg2;
 		break;
 	case LDB_REQ_MODIFY:
-		modified_orig_request.op.mod.message = msg2;
+		modified_orig_request->op.mod.message = msg2;
 		break;
 	}
 
 	/* Send the (modified) request of the original caller down to the database */
-	ret = ldb_next_request(module, &modified_orig_request);
+	ret = ldb_next_request(module, modified_orig_request);
 	if (ret) {
 		return ret;
 	}
@@ -206,7 +218,7 @@
 		}
 
 		/* Find out the old passwords details of the user */
-		old_res = search_request.op.search.res;
+		old_res = search_request->op.search.res;
 		
 		if (old_res->count != 1) {
 			ldb_set_errstring(module, 
@@ -230,20 +242,26 @@
 	 * with the password. */
 
 	/* Now find out what is on the entry after the above add/modify */
-	search_request.operation       = LDB_REQ_SEARCH;
-	search_request.op.search.base  = dn;
-	search_request.op.search.scope = LDB_SCOPE_BASE;
-	search_request.op.search.tree  = ldb_parse_tree(module->ldb, NULL);
-	search_request.op.search.attrs = user_attrs;
+	search_request = talloc(mem_ctx, struct ldb_request);
+	if (!search_request) {
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	search_request->operation       = LDB_REQ_SEARCH;
+	search_request->op.search.base  = dn;
+	search_request->op.search.scope = LDB_SCOPE_BASE;
+	search_request->op.search.tree  = ldb_parse_tree(module->ldb, NULL);
+	search_request->op.search.attrs = user_attrs;
 	
-	ret = ldb_next_request(module, &search_request);
+	ret = ldb_next_request(module, search_request);
 	if (ret) {
 		talloc_free(mem_ctx);
 		return ret;
 	}
 
 	/* Find out the full details of the user */
-	res = search_request.op.search.res;
+	res = search_request->op.search.res;
 	if (res->count != 1) {
 		ldb_set_errstring(module, 
 				  talloc_asprintf(mem_ctx, "password_hash_handle: "
@@ -630,10 +648,16 @@
 	/* Too much code above, we should check we got it close to reasonable */
 	CHECK_RET(ldb_msg_sanity_check(modify_msg));
 
-	modify_request.operation = LDB_REQ_MODIFY;
-	modify_request.op.mod.message = modify_msg;
+	modify_request = talloc(mem_ctx, struct ldb_request);
+	if (!modify_request) {
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
 
-	ret = ldb_next_request(module, &modify_request);
+	modify_request->operation = LDB_REQ_MODIFY;
+	modify_request->op.mod.message = modify_msg;
+
+	ret = ldb_next_request(module, modify_request);
 	
 	talloc_free(mem_ctx);
 	return ret;

Modified: branches/SAMBA_4_0/source/lib/ldb/modules/objectclass.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/modules/objectclass.c	2006-01-04 16:00:42 UTC (rev 12715)
+++ branches/SAMBA_4_0/source/lib/ldb/modules/objectclass.c	2006-01-05 02:14:01 UTC (rev 12716)
@@ -56,8 +56,8 @@
 {
 	TALLOC_CTX *mem_ctx;
 	int ret;
-	struct ldb_request search_request;
-	struct ldb_request modify_request;
+	struct ldb_request *search_request;
+	struct ldb_request *modify_request;
 	struct ldb_message *modify_msg;
 	struct ldb_result *res;
 	const char *attrs[] = { "objectClass", NULL };
@@ -92,23 +92,29 @@
 	/* Thanks to transactions: Now do a search, find the full list
 	 * of objectClasses and do the sort */
 
-	search_request.operation       = LDB_REQ_SEARCH;
-	search_request.op.search.base  = msg->dn;
-	search_request.op.search.scope = LDB_SCOPE_BASE;
-	search_request.op.search.tree  = ldb_parse_tree(module->ldb, NULL);
-	search_request.op.search.attrs = attrs;
+	mem_ctx = talloc_new(module);
+	if (!mem_ctx) {
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
 
-	ret = ldb_next_request(module, &search_request);
+	search_request = talloc(mem_ctx, struct ldb_request);
+	if (!search_request) {
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
+
+	search_request->operation       = LDB_REQ_SEARCH;
+	search_request->op.search.base  = msg->dn;
+	search_request->op.search.scope = LDB_SCOPE_BASE;
+	search_request->op.search.tree  = ldb_parse_tree(module->ldb, NULL);
+	search_request->op.search.attrs = attrs;
+
+	ret = ldb_next_request(module, search_request);
 	if (ret) {
 		return ret;
 	}
 
-	mem_ctx = talloc_new(module);
-	if (!mem_ctx) {
-		return LDB_ERR_OPERATIONS_ERROR;
-	}
-
-	res = search_request.op.search.res;
+	res = search_request->op.search.res;
 	talloc_steal(mem_ctx, res);
 	if (res->count != 1) {
 		ldb_set_errstring(module, 
@@ -259,11 +265,17 @@
 		return ret;
 	}
 
-	modify_request.operation = LDB_REQ_MODIFY;
-	modify_request.op.mod.message = modify_msg;
+	modify_request = talloc(mem_ctx, struct ldb_request);
+	if (!modify_request) {
+		talloc_free(mem_ctx);
+		return LDB_ERR_OPERATIONS_ERROR;
+	}
 
+	modify_request->operation = LDB_REQ_MODIFY;
+	modify_request->op.mod.message = modify_msg;
+
 	/* And now push the write into the database */
-	ret = ldb_next_request(module, &modify_request);
+	ret = ldb_next_request(module, modify_request);
 	
 	talloc_free(mem_ctx);
 	return ret;



More information about the samba-cvs mailing list