svn commit: samba r22793 - in branches/SAMBA_4_0/source/wrepl_server: .

metze at samba.org metze at samba.org
Fri May 11 10:15:25 GMT 2007


Author: metze
Date: 2007-05-11 10:15:20 +0000 (Fri, 11 May 2007)
New Revision: 22793

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

Log:
use a state struct for r_do_release_demand to avoid a memleak on errors

metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c


Changeset:
Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c	2007-05-11 10:13:10 UTC (rev 22792)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c	2007-05-11 10:15:20 UTC (rev 22793)
@@ -1082,11 +1082,20 @@
 	return NT_STATUS_OK;
 }
 
+struct r_do_release_demand_state {
+	struct messaging_context *msg_ctx;
+	struct nbtd_proxy_wins_release_demand r;
+};
+
 static void r_do_release_demand_handler(struct irpc_request *ireq)
 {
 	NTSTATUS status;
+	struct r_do_release_demand_state *state = talloc_get_type(ireq->async.private,
+						  struct r_do_release_demand_state);
+
 	status = irpc_call_recv(ireq);
 	/* don't care about the result */
+	talloc_free(state);
 }
 
 static NTSTATUS r_do_release_demand(struct wreplsrv_partner *partner,
@@ -1100,7 +1109,7 @@
 	struct server_id *nbt_servers;
 	const char **addrs;
 	struct winsdb_addr **addresses;
-	struct nbtd_proxy_wins_release_demand r;
+	struct r_do_release_demand_state *state;
 	uint32_t i;
 
 	/*
@@ -1116,30 +1125,36 @@
 	DEBUG(4,("release demand record %s\n",
 		 nbt_name_string(mem_ctx, &replica->name)));
 
-	nbt_servers = irpc_servers_byname(partner->service->task->msg_ctx, mem_ctx, "nbt_server");
+	state = talloc_zero(mem_ctx, struct r_do_release_demand_state);
+	NT_STATUS_HAVE_NO_MEMORY(state);
+	state->msg_ctx	= partner->service->task->msg_ctx;
+
+	nbt_servers = irpc_servers_byname(state->msg_ctx, state, "nbt_server");
 	if ((nbt_servers == NULL) || (nbt_servers[0].id == 0)) {
 		return NT_STATUS_INTERNAL_ERROR;
 	}
 
-	r.in.name	= *rec->name;
-	r.in.num_addrs	= winsdb_addr_list_length(addresses);
-	r.in.addrs	= talloc_array(partner, struct nbtd_proxy_wins_addr, r.in.num_addrs);
-	NT_STATUS_HAVE_NO_MEMORY(r.in.addrs);
+	state->r.in.name	= *rec->name;
+	state->r.in.num_addrs	= winsdb_addr_list_length(addresses);
+	state->r.in.addrs	= talloc_array(state, struct nbtd_proxy_wins_addr,
+					       state->r.in.num_addrs);
+	NT_STATUS_HAVE_NO_MEMORY(state->r.in.addrs);
 	/* TODO: fix pidl to handle inline ipv4address arrays */
-	addrs			= winsdb_addr_string_list(r.in.addrs, addresses);
+	addrs			= winsdb_addr_string_list(state->r.in.addrs, addresses);
 	NT_STATUS_HAVE_NO_MEMORY(addrs);
-	for (i=0; i < r.in.num_addrs; i++) {
-		r.in.addrs[i].addr = addrs[i];
+	for (i=0; i < state->r.in.num_addrs; i++) {
+		state->r.in.addrs[i].addr = addrs[i];
 	}
 
-	ireq = IRPC_CALL_SEND(partner->service->task->msg_ctx, nbt_servers[0],
+	ireq = IRPC_CALL_SEND(state->msg_ctx, nbt_servers[0],
 			      irpc, NBTD_PROXY_WINS_RELEASE_DEMAND,
-			      &r, partner);
+			      &state->r, state);
 	NT_STATUS_HAVE_NO_MEMORY(ireq);
 
 	ireq->async.fn		= r_do_release_demand_handler;
-	ireq->async.private	= NULL;
+	ireq->async.private	= state;
 
+	talloc_steal(partner, state);
 	return NT_STATUS_OK;
 }
 



More information about the samba-cvs mailing list