summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2010-03-29 14:58:19 +0200
committerKarolin Seeger <kseeger@samba.org>2010-05-06 14:08:36 +0200
commitfc37e8163e89975e01c623c19107a6f3caf9573f (patch)
tree9d3ac86041b52c1a3eb65165248af6588ae5b96a
parent11fb429cb8314e06b6cdd2c789e102c31e82315f (diff)
downloadsamba-fc37e8163e89975e01c623c19107a6f3caf9573f.tar.gz
s3:rpc_client: don't mix layers and keep a reference to cli_state in the caller
We should not rely on the backend to have a reference to the cli_state. This will make it possible for the backend to set its cli_state reference to NULL, when the transport is dead. metze (cherry picked from commit dc09b12681ea0e6d4c2b0f1c99dfeb1f23019c65) (cherry picked from commit 1e2e47da82aeb249dce431541738a62cb139aebb) Signed-off-by: Stefan Metzmacher <metze@samba.org> (cherry picked from commit 582b1cdeb6c0b2145b55930421e8d48ad4754d04)
-rw-r--r--source3/rpc_client/cli_pipe.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index 323f861a9fa..cc0c66c2171 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -3464,14 +3464,14 @@ NTSTATUS rpc_pipe_open_ncalrpc(TALLOC_CTX *mem_ctx, const char *socket_path,
return status;
}
-static int rpc_pipe_client_np_destructor(struct rpc_pipe_client *p)
-{
+struct rpc_pipe_client_np_ref {
struct cli_state *cli;
+ struct rpc_pipe_client *pipe;
+};
- cli = rpc_pipe_np_smb_conn(p);
- if (cli != NULL) {
- DLIST_REMOVE(cli->pipe_list, p);
- }
+static int rpc_pipe_client_np_ref_destructor(struct rpc_pipe_client_np_ref *np_ref)
+{
+ DLIST_REMOVE(np_ref->cli->pipe_list, np_ref->pipe);
return 0;
}
@@ -3494,6 +3494,7 @@ static NTSTATUS rpc_pipe_open_np(struct cli_state *cli,
{
struct rpc_pipe_client *result;
NTSTATUS status;
+ struct rpc_pipe_client_np_ref *np_ref;
/* sanity check to protect against crashes */
@@ -3530,8 +3531,16 @@ static NTSTATUS rpc_pipe_open_np(struct cli_state *cli,
result->transport->transport = NCACN_NP;
- DLIST_ADD(cli->pipe_list, result);
- talloc_set_destructor(result, rpc_pipe_client_np_destructor);
+ np_ref = talloc(result->transport, struct rpc_pipe_client_np_ref);
+ if (np_ref == NULL) {
+ TALLOC_FREE(result);
+ return NT_STATUS_NO_MEMORY;
+ }
+ np_ref->cli = cli;
+ np_ref->pipe = result;
+
+ DLIST_ADD(np_ref->cli->pipe_list, np_ref->pipe);
+ talloc_set_destructor(np_ref, rpc_pipe_client_np_ref_destructor);
*presult = result;
return NT_STATUS_OK;