s3-rpc_server: Create common function to allocate pipes_struct
authorSimo Sorce <idra@samba.org>
Thu, 21 Jul 2011 15:02:59 +0000 (11:02 -0400)
committerAndreas Schneider <asn@cryptomilk.org>
Thu, 21 Jul 2011 17:50:02 +0000 (19:50 +0200)
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 <asn@samba.org>
Autobuild-User: Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date: Thu Jul 21 19:50:02 CEST 2011 on sn-devel-104

source3/rpc_server/rpc_handles.c
source3/rpc_server/rpc_ncacn_np.c
source3/rpc_server/rpc_pipes.h
source3/rpc_server/rpc_server.c

index 1fbee9e3c0133313c0be32460a9e867e244981c4..c40029bd0889f986adf63144773e8fc9c7cf142d 100644 (file)
@@ -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;
index dea079f3f5cfe022530b4d3d0b95f24581563c76..2ed4a017043bae31da93f78d9c30d6fb82e0e8c7 100644 (file)
@@ -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;
 }
index 9315830351d3aba7a8d0c56ff0c430e54f7da838..bfef5d6d11801992c82a872810e1d1894ed6d4c9 100644 (file)
@@ -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);
 
index 7b0982e9b1aa296b1da1d59826c0bc672bd4c434..43e549b5ae3c4772ccf9c0ff68fd2ab5bc5bbbe8 100644 (file)
@@ -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;
 }