STEP01x: move dcerpc_submit_fault
authorStefan Metzmacher <metze@samba.org>
Thu, 20 Mar 2014 09:24:23 +0000 (10:24 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 4 Jun 2019 10:58:04 +0000 (12:58 +0200)
librpc/rpc/dcerpc_connection.c

index 33124a00e8603ff122a5b4f661bba439af368ee4..1a8379b9628a48bc48b3b02f0674cffe081477cc 100644 (file)
@@ -2823,6 +2823,91 @@ NTSTATUS dcerpc_do_request_recv(struct tevent_req *req,
        return NT_STATUS_OK;
 }
 
+struct dcerpc_submit_fault_frag {
+       DATA_BLOB blob;
+       struct iovec vector;
+};
+
+static void dcerpc_submit_fault_done(struct tevent_req *subreq);
+
+static NTSTATUS dcerpc_submit_fault(struct dcerpc_connection *conn,
+                                   struct tevent_context *ev,
+                                   uint32_t call_id,
+                                   uint32_t context_id,
+                                   NTSTATUS nt_status)
+{
+       struct dcerpc_submit_fault_frag *frag;
+       NTSTATUS error;
+       union dcerpc_payload u;
+       struct tevent_req *subreq;
+
+       if (!dcerpc_connection_is_connected(conn)) {
+               return NT_STATUS_OK;
+       }
+
+       /*
+        * the fragment belongs to the connection instead of the request
+        * because it has to remain in case the request is canceled
+        */
+       frag = talloc_zero(conn, struct dcerpc_submit_fault_frag);
+       if (frag == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ZERO_STRUCT(u.fault);
+       u.fault.context_id = context_id;
+       u.fault.status = dcerpc_fault_from_nt_status(nt_status);
+
+       error = dcerpc_ncacn_packet_blob(frag,
+                                        DCERPC_PKT_FAULT,
+                                        DCERPC_PFC_FLAG_FIRST |
+                                        DCERPC_PFC_FLAG_LAST,
+                                        0,
+                                        call_id,
+                                        &u,
+                                        &frag->blob);
+       if (!NT_STATUS_IS_OK(error)) {
+               TALLOC_FREE(frag);
+               return error;
+       }
+
+       /* explicitly set frag_len here as dcerpc_push_ncacn_packet() can't
+        * compute it right for requests because the auth trailer is missing
+        * at this stage */
+       //dcerpc_set_frag_length(&frag->blob, frag_len);
+
+       /*
+        * We need to add a dcerpc_write_fragment_queue_send/recv()
+        */
+
+       frag->vector.iov_base = frag->blob.data;
+       frag->vector.iov_len = frag->blob.length;
+       subreq = tstream_writev_queue_send(frag, ev,
+                                          conn->transport.stream,
+                                          conn->transport.write_queue,
+                                          &frag->vector, 1);
+       if (subreq == NULL) {
+               TALLOC_FREE(frag);
+               return NT_STATUS_NO_MEMORY;
+       }
+       tevent_req_set_callback(subreq,
+                               dcerpc_submit_fault_done,
+                               frag);
+
+       return NT_STATUS_OK;
+}
+
+static void dcerpc_submit_fault_done(struct tevent_req *subreq)
+{
+       struct dcerpc_submit_fault_frag *frag =
+               tevent_req_callback_data(subreq,
+               struct dcerpc_submit_fault_frag);
+
+       TALLOC_FREE(subreq);
+
+       TALLOC_FREE(frag);
+}
+
 struct dcerpc_server_connection_loop_state {
        struct tevent_context *ev;
        struct dcerpc_connection *conn;
@@ -2993,87 +3078,3 @@ NTSTATUS dcerpc_server_connection_loop_recv(struct tevent_req *req)
        return tevent_req_simple_recv_ntstatus(req);
 }
 
-struct dcerpc_submit_fault_frag {
-       DATA_BLOB blob;
-       struct iovec vector;
-};
-
-static void dcerpc_submit_fault_done(struct tevent_req *subreq);
-
-static NTSTATUS dcerpc_submit_fault(struct dcerpc_connection *conn,
-                                   struct tevent_context *ev,
-                                   uint32_t call_id,
-                                   uint32_t context_id,
-                                   NTSTATUS nt_status)
-{
-       struct dcerpc_submit_fault_frag *frag;
-       NTSTATUS error;
-       union dcerpc_payload u;
-       struct tevent_req *subreq;
-
-       if (!dcerpc_connection_is_connected(conn)) {
-               return NT_STATUS_OK;
-       }
-
-       /*
-        * the fragment belongs to the connection instead of the request
-        * because it has to remain in case the request is canceled
-        */
-       frag = talloc_zero(conn, struct dcerpc_submit_fault_frag);
-       if (frag == NULL) {
-               return NT_STATUS_NO_MEMORY;
-       }
-
-       ZERO_STRUCT(u.fault);
-       u.fault.context_id = context_id;
-       u.fault.status = dcerpc_fault_from_nt_status(nt_status);
-
-       error = dcerpc_ncacn_packet_blob(frag,
-                                        DCERPC_PKT_FAULT,
-                                        DCERPC_PFC_FLAG_FIRST |
-                                        DCERPC_PFC_FLAG_LAST,
-                                        0,
-                                        call_id,
-                                        &u,
-                                        &frag->blob);
-       if (!NT_STATUS_IS_OK(error)) {
-               TALLOC_FREE(frag);
-               return error;
-       }
-
-       /* explicitly set frag_len here as dcerpc_push_ncacn_packet() can't
-        * compute it right for requests because the auth trailer is missing
-        * at this stage */
-       //dcerpc_set_frag_length(&frag->blob, frag_len);
-
-       /*
-        * We need to add a dcerpc_write_fragment_queue_send/recv()
-        */
-
-       frag->vector.iov_base = frag->blob.data;
-       frag->vector.iov_len = frag->blob.length;
-       subreq = tstream_writev_queue_send(frag, ev,
-                                          conn->transport.stream,
-                                          conn->transport.write_queue,
-                                          &frag->vector, 1);
-       if (subreq == NULL) {
-               TALLOC_FREE(frag);
-               return NT_STATUS_NO_MEMORY;
-       }
-       tevent_req_set_callback(subreq,
-                               dcerpc_submit_fault_done,
-                               frag);
-
-       return NT_STATUS_OK;
-}
-
-static void dcerpc_submit_fault_done(struct tevent_req *subreq)
-{
-       struct dcerpc_submit_fault_frag *frag =
-               tevent_req_callback_data(subreq,
-               struct dcerpc_submit_fault_frag);
-
-       TALLOC_FREE(subreq);
-
-       TALLOC_FREE(frag);
-}