s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_fault_pdu().
authorGünther Deschner <gd@samba.org>
Mon, 23 Mar 2009 10:05:21 +0000 (11:05 +0100)
committerSimo Sorce <idra@samba.org>
Thu, 8 Jul 2010 03:45:50 +0000 (23:45 -0400)
Guenther

Signed-off-by: Simo Sorce <idra@samba.org>
source3/rpc_server/srv_pipe.c

index 05351c9516a79854b80e2a0b31cb0fb34f826a85..6a40f32e23cae4599eabdd782e29868abf64a3ee 100644 (file)
@@ -910,11 +910,11 @@ static bool setup_bind_nak(pipes_struct *p)
  Marshall a fault pdu.
 *******************************************************************/
 
-bool setup_fault_pdu(pipes_struct *p, NTSTATUS status)
+bool setup_fault_pdu(pipes_struct *p, NTSTATUS fault_status)
 {
-       RPC_HDR fault_hdr;
-       RPC_HDR_RESP hdr_resp;
-       RPC_HDR_FAULT fault_resp;
+       NTSTATUS status;
+       union dcerpc_payload u;
+       DATA_BLOB blob;
 
        /* Free any memory in the current return data buffer. */
        prs_mem_free(&p->out_data.rdata);
@@ -931,36 +931,26 @@ bool setup_fault_pdu(pipes_struct *p, NTSTATUS status)
         * Initialize a fault header.
         */
 
-       init_rpc_hdr(&fault_hdr, DCERPC_PKT_FAULT, DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
-            p->hdr.call_id, RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN, 0);
-
-       /*
-        * Initialize the HDR_RESP and FAULT parts of the PDU.
-        */
-
-       memset((char *)&hdr_resp, '\0', sizeof(hdr_resp));
-
-       fault_resp.status = status;
-       fault_resp.reserved = 0;
-
-       /*
-        * Marshall the header into the outgoing PDU.
-        */
+       ZERO_STRUCT(u);
 
-       if(!smb_io_rpc_hdr("", &fault_hdr, &p->out_data.frag, 0)) {
-               DEBUG(0,("setup_fault_pdu: marshalling of RPC_HDR failed.\n"));
-               prs_mem_free(&p->out_data.frag);
-               return False;
-       }
+       u.fault.status          = NT_STATUS_V(fault_status);
+       u.fault._pad            = data_blob_talloc_zero(p->mem_ctx, 4);
 
-       if(!smb_io_rpc_hdr_resp("resp", &hdr_resp, &p->out_data.frag, 0)) {
-               DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_RESP.\n"));
+       status = dcerpc_push_ncacn_packet(p->mem_ctx,
+                                         DCERPC_PKT_FAULT,
+                                         DCERPC_PFC_FLAG_FIRST | DCERPC_PFC_FLAG_LAST | DCERPC_PFC_FLAG_DID_NOT_EXECUTE,
+                                         RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_FAULT_LEN /* FIXME - gd */,
+                                         0,
+                                         p->hdr.call_id,
+                                         u,
+                                         &blob);
+       if (!NT_STATUS_IS_OK(status)) {
                prs_mem_free(&p->out_data.frag);
                return False;
        }
 
-       if(!smb_io_rpc_hdr_fault("fault", &fault_resp, &p->out_data.frag, 0)) {
-               DEBUG(0,("setup_fault_pdu: failed to marshall RPC_HDR_FAULT.\n"));
+       if (!prs_copy_data_in(&p->out_data.frag,
+                             (char *)blob.data, blob.length)) {
                prs_mem_free(&p->out_data.frag);
                return False;
        }