From: Samuel Cabrero Date: Mon, 18 Feb 2019 18:31:04 +0000 (+0100) Subject: s3:rpc_server: Add a function to initialize the dcerpc_ncacn_conn struct X-Git-Tag: talloc-2.3.0~25 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2e938e22ac9484ccefd266ceed590cfbf5c01599;p=thirdparty%2Fsamba.git s3:rpc_server: Add a function to initialize the dcerpc_ncacn_conn struct Signed-off-by: Samuel Cabrero Reviewed-by: Andreas Schneider Reviewed-by: Stefan Metzmacher --- diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index c9859453d2b..8eb138434d1 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -989,7 +989,46 @@ static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn) return 0; } +NTSTATUS dcerpc_ncacn_conn_init(TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + enum dcerpc_transport_t transport, + const char *name, + dcerpc_ncacn_disconnect_fn disconnect_fn, + dcerpc_ncacn_termination_fn term_fn, + void *termination_data, + struct dcerpc_ncacn_conn **out) +{ + struct dcerpc_ncacn_conn *ncacn_conn = NULL; + + ncacn_conn = talloc_zero(mem_ctx, struct dcerpc_ncacn_conn); + if (ncacn_conn == NULL) { + return NT_STATUS_NO_MEMORY; + } + talloc_set_destructor(ncacn_conn, dcerpc_ncacn_conn_destructor); + + ncacn_conn->transport = transport; + ncacn_conn->ev_ctx = ev_ctx; + ncacn_conn->msg_ctx = msg_ctx; + ncacn_conn->sock = -1; + ncacn_conn->disconnect_fn = disconnect_fn; + ncacn_conn->termination_fn = term_fn; + ncacn_conn->termination_data = termination_data; + if (name != NULL) { + ncacn_conn->name = talloc_strdup(ncacn_conn, name); + if (ncacn_conn->name == NULL) { + talloc_free(ncacn_conn); + return NT_STATUS_NO_MEMORY;; + } + } + + *out = ncacn_conn; + + return NT_STATUS_OK; +} + static void dcerpc_ncacn_packet_process(struct tevent_req *subreq); + static void dcerpc_ncacn_packet_done(struct tevent_req *subreq); static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn); @@ -1005,34 +1044,28 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, void *termination_data) { struct dcerpc_ncacn_conn *ncacn_conn; + NTSTATUS status; int rc; DEBUG(10, ("dcerpc_ncacn_accept\n")); - ncacn_conn = talloc_zero(ev_ctx, struct dcerpc_ncacn_conn); - if (ncacn_conn == NULL) { - DEBUG(0, ("Out of memory!\n")); + status = dcerpc_ncacn_conn_init(ev_ctx, + ev_ctx, + msg_ctx, + transport, + name, + disconnect_fn, + termination_fn, + termination_data, + &ncacn_conn); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("Failed to initialize dcerpc_ncacn_connection: %s\n", + nt_errstr(status)); close(s); return; } - talloc_set_destructor(ncacn_conn, dcerpc_ncacn_conn_destructor); - ncacn_conn->transport = transport; - ncacn_conn->ev_ctx = ev_ctx; - ncacn_conn->msg_ctx = msg_ctx; ncacn_conn->sock = s; - ncacn_conn->disconnect_fn = disconnect_fn; - ncacn_conn->termination_fn = termination_fn; - ncacn_conn->termination_data = termination_data; - if (name != NULL) { - ncacn_conn->name = talloc_strdup(ncacn_conn, name); - if (ncacn_conn->name == NULL) { - DBG_ERR("Out of memory!\n"); - talloc_free(ncacn_conn); - close(s); - return; - } - } ncacn_conn->remote_client_addr = talloc_move(ncacn_conn, &cli_addr); if (tsocket_address_is_inet(ncacn_conn->remote_client_addr, "ip")) { diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index fd2e2a86011..34651a821a0 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -96,6 +96,16 @@ struct named_pipe_client *named_pipe_client_init(TALLOC_CTX *mem_ctx, uint64_t allocation_size, void *private_data); +NTSTATUS dcerpc_ncacn_conn_init(TALLOC_CTX *mem_ctx, + struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + enum dcerpc_transport_t transport, + const char *name, + dcerpc_ncacn_disconnect_fn disconnect_fn, + dcerpc_ncacn_termination_fn term_fn, + void *termination_data, + struct dcerpc_ncacn_conn **out); + int make_server_pipes_struct(TALLOC_CTX *mem_ctx, struct messaging_context *msg_ctx, const char *pipe_name,