s3-dcerpc: use dcerpc_pull_ncacn_packet() for pulling a RPC fault pdu.
authorGünther Deschner <gd@samba.org>
Mon, 23 Mar 2009 11:00:40 +0000 (12:00 +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_client/cli_pipe.c

index 5b3894c6ec87110a50fdcf2cd43df7fcacf7d7d1..3d2362b64ceee080b4d01374128fa125457abc1b 100644 (file)
@@ -1140,27 +1140,25 @@ static NTSTATUS cli_pipe_validate_current_pdu(struct rpc_pipe_client *cli, RPC_H
 
                case DCERPC_PKT_FAULT:
                {
-                       RPC_HDR_RESP rhdr_resp;
-                       RPC_HDR_FAULT fault_resp;
+                       DATA_BLOB blob;
+                       struct ncacn_packet r;
 
-                       if(!smb_io_rpc_hdr_resp("rpc_hdr_resp", &rhdr_resp, current_pdu, 0)) {
-                               DEBUG(5,("cli_pipe_validate_current_pdu: failed to unmarshal RPC_HDR_RESP.\n"));
-                               return NT_STATUS_BUFFER_TOO_SMALL;
-                       }
+                       blob = data_blob_const(prs_data_p(current_pdu),
+                                              prs_data_size(current_pdu));
 
-                       if(!smb_io_rpc_hdr_fault("fault", &fault_resp, current_pdu, 0)) {
-                               DEBUG(5,("cli_pipe_validate_current_pdu: failed to unmarshal RPC_HDR_FAULT.\n"));
-                               return NT_STATUS_BUFFER_TOO_SMALL;
+                       ret = dcerpc_pull_ncacn_packet(cli, &blob, &r);
+                       if (!NT_STATUS_IS_OK(ret)) {
+                               return ret;
                        }
-
                        DEBUG(1, ("cli_pipe_validate_current_pdu: RPC fault "
                                  "code %s received from %s!\n",
-                               dcerpc_errstr(talloc_tos(), NT_STATUS_V(fault_resp.status)),
+                               dcerpc_errstr(talloc_tos(), r.u.fault.status),
                                rpccli_pipe_txt(talloc_tos(), cli)));
-                       if (NT_STATUS_IS_OK(fault_resp.status)) {
+
+                       if (NT_STATUS_IS_OK(NT_STATUS(r.u.fault.status))) {
                                return NT_STATUS_UNSUCCESSFUL;
                        } else {
-                               return fault_resp.status;
+                               return NT_STATUS(r.u.fault.status);
                        }
                }