]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
s3:rpc_server: Store dcesrv context and endpoint in ncacn_conn
authorSamuel Cabrero <scabrero@suse.de>
Wed, 27 Feb 2019 22:44:16 +0000 (23:44 +0100)
committerSamuel Cabrero <scabrero@sn-devel-184>
Fri, 20 Mar 2020 15:36:35 +0000 (15:36 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/rpc_server/rpc_ncacn_np.c
source3/rpc_server/rpc_server.c
source3/rpc_server/rpc_server.h

index a0a880985e101adab4289aed6649ed14f3ee62fc..4fc6a75635356d99817e877f04e277d31bf4a790 100644 (file)
@@ -131,8 +131,8 @@ NTSTATUS make_internal_rpc_pipe_socketpair(
        status = dcerpc_ncacn_conn_init(npa,
                                        ev_ctx,
                                        msg_ctx,
-                                       NCACN_NP,
-                                       pipe_name,
+                                       dce_ctx,
+                                       endpoint,
                                        NULL, /* termination fn */
                                        NULL, /* termination data */
                                        &ncacn_conn);
index 713d9cf634254547815f0b5d01cc5c9c17bef1a1..dbb4ce836d7ceee791af7e42cda8857d05005fdc 100644 (file)
@@ -739,8 +739,8 @@ static int dcerpc_ncacn_conn_destructor(struct dcerpc_ncacn_conn *ncacn_conn)
 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,
+                               struct dcesrv_context *dce_ctx,
+                               struct dcesrv_endpoint *endpoint,
                                dcerpc_ncacn_termination_fn term_fn,
                                void *termination_data,
                                struct dcerpc_ncacn_conn **out)
@@ -753,19 +753,13 @@ NTSTATUS dcerpc_ncacn_conn_init(TALLOC_CTX *mem_ctx,
        }
        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->dce_ctx = dce_ctx;
+       ncacn_conn->endpoint = endpoint;
        ncacn_conn->sock = -1;
        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;
 
@@ -791,9 +785,6 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
 {
        enum dcerpc_transport_t transport =
                dcerpc_binding_get_transport(e->ep_description);
-       const char *endpoint =
-               dcerpc_binding_get_string_option(e->ep_description,
-                                                "endpoint");
        struct dcerpc_ncacn_conn *ncacn_conn;
        NTSTATUS status;
        int rc;
@@ -803,8 +794,8 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx,
        status = dcerpc_ncacn_conn_init(ev_ctx,
                                        ev_ctx,
                                        msg_ctx,
-                                       transport,
-                                       endpoint,
+                                       dce_ctx,
+                                       e,
                                        termination_fn,
                                        termination_data,
                                        &ncacn_conn);
@@ -941,8 +932,12 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn)
        gid_t gid;
        int rc;
        int sys_errno;
+       enum dcerpc_transport_t transport = dcerpc_binding_get_transport(
+                       ncacn_conn->endpoint->ep_description);
+       const char *endpoint = dcerpc_binding_get_string_option(
+                       ncacn_conn->endpoint->ep_description, "endpoint");
 
-       switch (ncacn_conn->transport) {
+       switch (transport) {
                case NCACN_IP_TCP:
                        pipe_name = tsocket_address_string(ncacn_conn->remote_client_addr,
                                                           ncacn_conn);
@@ -985,8 +980,7 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn)
 
                        FALL_THROUGH;
                case NCACN_NP:
-                       pipe_name = talloc_strdup(ncacn_conn,
-                                                 ncacn_conn->name);
+                       pipe_name = talloc_strdup(ncacn_conn, endpoint);
                        if (pipe_name == NULL) {
                                DBG_ERR("No memory\n");
                                ncacn_terminate_connection(ncacn_conn, "No memory");
@@ -994,8 +988,7 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn)
                        }
                        break;
                default:
-                       DBG_ERR("unknown dcerpc transport: %u!\n",
-                               ncacn_conn->transport);
+                       DBG_ERR("unknown dcerpc transport: %u!\n", transport);
                        ncacn_terminate_connection(ncacn_conn,
                                        "Unknown DCE/RPC transport");
                        return;
@@ -1018,7 +1011,7 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn)
        rc = make_server_pipes_struct(ncacn_conn,
                                      ncacn_conn->msg_ctx,
                                      pipe_name,
-                                     ncacn_conn->transport,
+                                     transport,
                                      ncacn_conn->remote_client_addr,
                                      ncacn_conn->local_server_addr,
                                      &ncacn_conn->session_info,
@@ -1067,6 +1060,8 @@ void dcerpc_ncacn_packet_process(struct tevent_req *subreq)
        size_t i;
        NTSTATUS status;
        bool ok;
+       enum dcerpc_transport_t transport = dcerpc_binding_get_transport(
+                       ncacn_conn->endpoint->ep_description);
 
        status = dcerpc_read_ncacn_packet_recv(subreq, ncacn_conn, &pkt, &recv_buffer);
        TALLOC_FREE(subreq);
@@ -1174,7 +1169,7 @@ void dcerpc_ncacn_packet_process(struct tevent_req *subreq)
                return;
        }
 
-       switch (ncacn_conn->transport) {
+       switch (transport) {
        case NCACN_NP:
                /* If sending packets over named pipe proxy we need to send
                 * each fragment on its own to be a message
@@ -1245,6 +1240,8 @@ static void dcerpc_ncacn_packet_done(struct tevent_req *subreq)
        NTSTATUS status = NT_STATUS_OK;
        int sys_errno;
        int rc;
+       enum dcerpc_transport_t transport = dcerpc_binding_get_transport(
+                       ncacn_conn->endpoint->ep_description);
 
        rc = tstream_writev_queue_recv(subreq, &sys_errno);
        TALLOC_FREE(subreq);
@@ -1254,7 +1251,7 @@ static void dcerpc_ncacn_packet_done(struct tevent_req *subreq)
                goto fail;
        }
 
-       if (ncacn_conn->transport == NCACN_NP &&
+       if (transport == NCACN_NP &&
            tevent_queue_length(ncacn_conn->send_queue) > 0) {
                /* More fragments to send before reading a new packet */
                return;
index f91f561dc3c17f74dd63f0d08c981952a449102a..58d5263b641323d6107dbb833299e224adeb2842 100644 (file)
@@ -31,9 +31,6 @@ struct cli_credentials;
 typedef void (*dcerpc_ncacn_termination_fn)(struct pipes_struct *, void *);
 
 struct dcerpc_ncacn_conn {
-       enum dcerpc_transport_t transport;
-
-       const char *name;
        int sock;
 
        struct pipes_struct *p;
@@ -42,6 +39,8 @@ struct dcerpc_ncacn_conn {
 
        struct tevent_context *ev_ctx;
        struct messaging_context *msg_ctx;
+       struct dcesrv_context *dce_ctx;
+       struct dcesrv_endpoint *endpoint;
 
        struct tstream_context *tstream;
        struct tevent_queue *send_queue;
@@ -59,8 +58,8 @@ struct dcerpc_ncacn_conn {
 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,
+                               struct dcesrv_context *dce_ctx,
+                               struct dcesrv_endpoint *endpoint,
                                dcerpc_ncacn_termination_fn term_fn,
                                void *termination_data,
                                struct dcerpc_ncacn_conn **out);