From 156a0ffe542339952a6e2db191ffc586227edd5a Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Thu, 21 Jul 2011 11:02:59 -0400 Subject: [PATCH] s3-rpc_server: Create common function to allocate pipes_struct Avoid code duplication and fix bug where a new pipe was not added to InternalPipes upon creation in make_server_pipes_struct() Signed-off-by: Andreas Schneider Autobuild-User: Andreas Schneider Autobuild-Date: Thu Jul 21 19:50:02 CEST 2011 on sn-devel-104 --- source3/rpc_server/rpc_handles.c | 50 +++++++++++++++++++++++++++++++ source3/rpc_server/rpc_ncacn_np.c | 41 +++++++------------------ source3/rpc_server/rpc_pipes.h | 8 +++++ source3/rpc_server/rpc_server.c | 45 +++++----------------------- 4 files changed, 76 insertions(+), 68 deletions(-) diff --git a/source3/rpc_server/rpc_handles.c b/source3/rpc_server/rpc_handles.c index 1fbee9e3c01..c40029bd088 100644 --- a/source3/rpc_server/rpc_handles.c +++ b/source3/rpc_server/rpc_handles.c @@ -25,6 +25,7 @@ #include "auth.h" #include "rpc_server/rpc_pipes.h" #include "../libcli/security/security.h" +#include "lib/tsocket/tsocket.h" #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV @@ -41,6 +42,55 @@ static struct pipes_struct *InternalPipes; * system _anyway_. so that's the next step... */ +int make_base_pipes_struct(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, + const char *pipe_name, + enum dcerpc_transport_t transport, + bool endian, bool ncalrpc_as_system, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + struct pipes_struct **_p) +{ + struct pipes_struct *p; + + p = talloc_zero(mem_ctx, struct pipes_struct); + if (!p) { + return ENOMEM; + } + + p->mem_ctx = talloc_named(p, 0, "pipe %s %p", pipe_name, p); + if (!p->mem_ctx) { + talloc_free(p); + return ENOMEM; + } + + p->msg_ctx = msg_ctx; + p->transport = transport; + p->endian = endian; + p->ncalrpc_as_system = ncalrpc_as_system; + + p->remote_address = tsocket_address_copy(remote_address, p); + if (p->remote_address == NULL) { + talloc_free(p); + return ENOMEM; + } + + if (local_address) { + p->local_address = tsocket_address_copy(remote_address, p); + if (p->local_address == NULL) { + talloc_free(p); + return ENOMEM; + } + } + + DLIST_ADD(InternalPipes, p); + talloc_set_destructor(p, close_internal_rpc_pipe_hnd); + + *_p = p; + return 0; +} + + bool check_open_pipes(void) { struct pipes_struct *p; diff --git a/source3/rpc_server/rpc_ncacn_np.c b/source3/rpc_server/rpc_ncacn_np.c index dea079f3f5c..2ed4a017043 100644 --- a/source3/rpc_server/rpc_ncacn_np.c +++ b/source3/rpc_server/rpc_ncacn_np.c @@ -31,7 +31,7 @@ #include "librpc/gen_ndr/auth.h" #include "../auth/auth_sam_reply.h" #include "auth.h" -#include "ntdomain.h" +#include "rpc_server/rpc_pipes.h" #include "../lib/tsocket/tsocket.h" #include "../lib/util/tevent_ntstatus.h" #include "rpc_contexts.h" @@ -51,26 +51,21 @@ struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx, { struct pipes_struct *p; struct pipe_rpc_fns *context_fns; + const char *pipe_name; + int ret; - DEBUG(4,("Create pipe requested %s\n", - get_pipe_name_from_syntax(talloc_tos(), syntax))); + pipe_name = get_pipe_name_from_syntax(talloc_tos(), syntax); - p = talloc_zero(mem_ctx, struct pipes_struct); + DEBUG(4,("Create pipe requested %s\n", pipe_name)); - if (!p) { + ret = make_base_pipes_struct(mem_ctx, msg_ctx, pipe_name, + NCALRPC, RPC_LITTLE_ENDIAN, false, + remote_address, NULL, &p); + if (ret) { DEBUG(0,("ERROR! no memory for pipes_struct!\n")); return NULL; } - p->mem_ctx = talloc_named(p, 0, "pipe %s %p", - get_pipe_name_from_syntax(talloc_tos(), - syntax), p); - if (p->mem_ctx == NULL) { - DEBUG(0,("open_rpc_pipe_p: talloc_init failed.\n")); - TALLOC_FREE(p); - return NULL; - } - if (!init_pipe_handles(p, syntax)) { DEBUG(0,("open_rpc_pipe_p: init_pipe_handles failed.\n")); TALLOC_FREE(p); @@ -85,19 +80,6 @@ struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx, return NULL; } - p->msg_ctx = msg_ctx; - - DLIST_ADD(InternalPipes, p); - - p->remote_address = tsocket_address_copy(remote_address, p); - if (p->remote_address == NULL) { - return false; - } - - p->endian = RPC_LITTLE_ENDIAN; - - p->transport = NCALRPC; - context_fns = SMB_MALLOC_P(struct pipe_rpc_fns); if (context_fns == NULL) { DEBUG(0,("malloc() failed!\n")); @@ -113,10 +95,7 @@ struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx, /* add to the list of open contexts */ DLIST_ADD(p->contexts, context_fns); - DEBUG(4,("Created internal pipe %s\n", - get_pipe_name_from_syntax(talloc_tos(), syntax))); - - talloc_set_destructor(p, close_internal_rpc_pipe_hnd); + DEBUG(4,("Created internal pipe %s\n", pipe_name)); return p; } diff --git a/source3/rpc_server/rpc_pipes.h b/source3/rpc_server/rpc_pipes.h index 9315830351d..bfef5d6d118 100644 --- a/source3/rpc_server/rpc_pipes.h +++ b/source3/rpc_server/rpc_pipes.h @@ -182,6 +182,14 @@ struct pipes_struct { }; +int make_base_pipes_struct(TALLOC_CTX *mem_ctx, + struct messaging_context *msg_ctx, + const char *pipe_name, + enum dcerpc_transport_t transport, + bool endian, bool ncalrpc_as_system, + const struct tsocket_address *remote_address, + const struct tsocket_address *local_address, + struct pipes_struct **_p); bool check_open_pipes(void); int close_internal_rpc_pipe_hnd(struct pipes_struct *p); diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 7b0982e9b1a..43e549b5ae3 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -20,7 +20,7 @@ */ #include "includes.h" -#include "ntdomain.h" +#include "rpc_server/rpc_pipes.h" #include "rpc_server/rpc_server.h" #include "rpc_dce.h" #include "librpc/gen_ndr/netlogon.h" @@ -64,29 +64,18 @@ static int make_server_pipes_struct(TALLOC_CTX *mem_ctx, { struct pipes_struct *p; NTSTATUS status; + int ret; - p = talloc_zero(mem_ctx, struct pipes_struct); - if (!p) { - *perrno = ENOMEM; - return -1; - } - - p->transport = transport; - p->ncalrpc_as_system = ncalrpc_as_system; - - p->mem_ctx = talloc_named(p, 0, "pipe %s %p", pipe_name, p); - if (!p->mem_ctx) { - TALLOC_FREE(p); - *perrno = ENOMEM; + ret = make_base_pipes_struct(mem_ctx, NULL, pipe_name, + transport, RPC_LITTLE_ENDIAN, + ncalrpc_as_system, + remote_address, local_address, &p); + if (ret) { + *perrno = ret; return -1; } p->msg_ctx = msg_ctx; - data_blob_free(&p->in_data.data); - data_blob_free(&p->in_data.pdu); - - p->endian = RPC_LITTLE_ENDIAN; - if (session_info->unix_token && session_info->unix_info && session_info->security_token) { /* Don't call create_local_token(), we already have the full details here */ p->session_info = talloc_steal(p, session_info); @@ -145,24 +134,6 @@ static int make_server_pipes_struct(TALLOC_CTX *mem_ctx, } } - p->remote_address = tsocket_address_copy(remote_address, p); - if (p->remote_address == NULL) { - TALLOC_FREE(p); - *perrno = ENOMEM; - return -1; - } - - if (local_address != NULL) { - p->local_address = tsocket_address_copy(local_address, p); - if (p->local_address == NULL) { - TALLOC_FREE(p); - *perrno = ENOMEM; - return -1; - } - } - - talloc_set_destructor(p, close_internal_rpc_pipe_hnd); - *_p = p; return 0; } -- 2.34.1