summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGünther Deschner <gd@samba.org>2009-03-23 11:05:21 +0100
committerSimo Sorce <idra@samba.org>2010-07-07 23:45:50 -0400
commit0cbe0f3c5fab1da968486269d65c02ffa44e54ca (patch)
treee52982a0089af873a39adcf43b278870fd84f4fc
parent8fdc02aa63d1a93de7e5008db4efb54e197afd17 (diff)
downloadsamba-0cbe0f3c5fab1da968486269d65c02ffa44e54ca.tar.gz
samba-0cbe0f3c5fab1da968486269d65c02ffa44e54ca.tar.bz2
samba-0cbe0f3c5fab1da968486269d65c02ffa44e54ca.zip
s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_fault_pdu().
Guenther Signed-off-by: Simo Sorce <idra@samba.org>
-rw-r--r--source3/rpc_server/srv_pipe.c46
1 files changed, 18 insertions, 28 deletions
diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c
index 05351c9516..6a40f32e23 100644
--- a/source3/rpc_server/srv_pipe.c
+++ b/source3/rpc_server/srv_pipe.c
@@ -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;
}