[SCM] Samba Shared Repository - branch master updated

Simo Sorce idra at samba.org
Thu Jul 8 00:39:55 MDT 2010


The branch, master has been updated
       via  7571c15... s3:dcerpc Remove unused structure and functions
       via  7236f8c... s3:dcerpc Use prs_parse_dcerpc_bind
       via  0d9b636... s3:dcerpc Add prs_parse_dcerpc_bind
       via  ae52651... s3:rpc user idl define dcerpc_ctx_list instead of custom RPC_CONTEXT
       via  d57ecf9... s3-dcerpc: use dcerpc_pull_ncacn_packet() for rpc_pipe_bind_step_one_done().
       via  5351a89... s3-dcerpc: use dcerpc_push_ncacn_packet() in push_next_frag().
       via  e8e2fa5... s3-dcerpc: use dcerpc_pull_ncacn_packet() in cli_pipe_validate_current_pdu().
       via  dbeaa5e... s3-dcerpc: use dcerpc_pull_dcerpc_auth() in cli_pipe_verify_ntlmssp().
       via  49c5293... s3-dcerpc: add dcerpc_pull_dcerpc_auth().
       via  fe9ce4b... s3-dcerpc: use struct ncacn_packet_header instead of struct rpc_hdr_info.
       via  77e3fff... s3-dcerpc: add dcerpc_pull_ncacn_packet_header().
       via  389a677... dcerpc: add ncacn_packet_header to IDL.
       via  eeb034e... s3-dcerpc: use dcerpc_push_dcerpc_auth() for all authenticated binds.
       via  4b56e6e... s3-dcerpc: add dcerpc_push_schannel_bind().
       via  0f02dda... s3-dcerpc: add dcerpc_push_dcerpc_auth().
       via  257f514... s3-dcerpc: remove unused init_rpc_hdr_rb and init_rpc_context.
       via  5aabd9a... s3-dcerpc: use dcerpc_push_ncacn_packet() for create_bind_or_alt_ctx_internal().
       via  dc6e0ce... s3-dcerpc: remove unused smb_io_rpc_hdr_fault.
       via  d6de820... s3-dcerpc: use dcerpc_pull_ncacn_packet() for pulling a RPC fault pdu.
       via  cb9eddb... s3-dcerpc: add dcerpc_pull_ncacn_packet().
       via  0cbe0f3... s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_fault_pdu().
       via  8fdc02a... s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_bind_nak().
       via  3d9a12d... s3-dcerpc: add dcerpc_push_ncacn_packet().
      from  f0b9184... s3:winbindd_samr Do not use static contexts

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7571c15af93f638a78d69378ce7c793b0e90dc4e
Author: Simo Sorce <idra at samba.org>
Date:   Thu Jul 8 01:48:05 2010 -0400

    s3:dcerpc Remove unused structure and functions

commit 7236f8cda93ccfbbbac74b9392bfb5dc93268bcb
Author: Simo Sorce <idra at samba.org>
Date:   Thu Jul 8 01:14:16 2010 -0400

    s3:dcerpc Use prs_parse_dcerpc_bind

commit 0d9b63663f888bafbc7451845a79dabf9ceadc0f
Author: Simo Sorce <idra at samba.org>
Date:   Thu Jul 8 01:13:57 2010 -0400

    s3:dcerpc Add prs_parse_dcerpc_bind

commit ae526514a936b46112845480646402fdd385d7a2
Author: Simo Sorce <idra at samba.org>
Date:   Wed Jul 7 17:14:27 2010 -0400

    s3:rpc user idl define dcerpc_ctx_list instead of custom RPC_CONTEXT

commit d57ecf920cfb0c1a03734f120e888d34bd618f2d
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 2 01:05:55 2009 +0200

    s3-dcerpc: use dcerpc_pull_ncacn_packet() for rpc_pipe_bind_step_one_done().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 5351a8919dcf705061242813186dfd29e03e72a0
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 2 00:35:19 2009 +0200

    s3-dcerpc: use dcerpc_push_ncacn_packet() in push_next_frag().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit e8e2fa586b81ddfe45e6751fafcce85842423eed
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 2 00:34:42 2009 +0200

    s3-dcerpc: use dcerpc_pull_ncacn_packet() in cli_pipe_validate_current_pdu().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit dbeaa5efc7ccbf52fd54e18c0cf7683a8fbc2cd4
Author: Günther Deschner <gd at samba.org>
Date:   Thu Apr 2 00:33:52 2009 +0200

    s3-dcerpc: use dcerpc_pull_dcerpc_auth() in cli_pipe_verify_ntlmssp().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 49c529349285a79f13b0e1f261f815c4beb62646
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 1 23:39:20 2009 +0200

    s3-dcerpc: add dcerpc_pull_dcerpc_auth().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit fe9ce4b60c60273d67b9616f7dcef2020136ddac
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 1 23:18:25 2009 +0200

    s3-dcerpc: use struct ncacn_packet_header instead of struct rpc_hdr_info.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 77e3fffd09e5548ded472bed25109ddda2d45b30
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 1 23:07:03 2009 +0200

    s3-dcerpc: add dcerpc_pull_ncacn_packet_header().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 389a6774264b273fa210dcd30669d58a5c0db615
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 1 23:04:23 2009 +0200

    dcerpc: add ncacn_packet_header to IDL.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit eeb034e72a0e3ed167ffe3c08162311a7c5d2fdf
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 24 23:56:42 2009 +0100

    s3-dcerpc: use dcerpc_push_dcerpc_auth() for all authenticated binds.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 4b56e6e95b7176921dc1bb28c344975074f4f17d
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 24 23:50:32 2009 +0100

    s3-dcerpc: add dcerpc_push_schannel_bind().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 0f02dda9154aeeda20d7bb3ca88bbaf89174e3ce
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 24 19:09:29 2009 +0100

    s3-dcerpc: add dcerpc_push_dcerpc_auth().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 257f5145b571960fce0e12ce0cd04dbd0ac83f6a
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 24 20:29:59 2009 +0100

    s3-dcerpc: remove unused init_rpc_hdr_rb and init_rpc_context.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 5aabd9af8e2abe0eafcafbba60a10ce9102d77c4
Author: Günther Deschner <gd at samba.org>
Date:   Tue Mar 24 18:21:18 2009 +0100

    s3-dcerpc: use dcerpc_push_ncacn_packet() for create_bind_or_alt_ctx_internal().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit dc6e0cedfcdd7ca0d9b7a13ecbc3e8520ddcc8f0
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 23 12:45:09 2009 +0100

    s3-dcerpc: remove unused smb_io_rpc_hdr_fault.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit d6de820480ce5db4b786a66886a5e255344acd43
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 23 12:00:40 2009 +0100

    s3-dcerpc: use dcerpc_pull_ncacn_packet() for pulling a RPC fault pdu.
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit cb9eddb31248f0c7b0ffcff642154ca4b0230276
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 23 12:00:12 2009 +0100

    s3-dcerpc: add dcerpc_pull_ncacn_packet().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 0cbe0f3c5fab1da968486269d65c02ffa44e54ca
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 23 11:05:21 2009 +0100

    s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_fault_pdu().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 8fdc02aa63d1a93de7e5008db4efb54e197afd17
Author: Günther Deschner <gd at samba.org>
Date:   Sat Mar 21 00:11:15 2009 +0100

    s3-dcerpc: use dcerpc_push_ncacn_packet() for setup_bind_nak().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

commit 3d9a12dca7e00e133702ea1d8d31e50eceac9039
Author: Günther Deschner <gd at samba.org>
Date:   Mon Mar 23 11:04:34 2009 +0100

    s3-dcerpc: add dcerpc_push_ncacn_packet().
    
    Guenther
    
    Signed-off-by: Simo Sorce <idra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 librpc/idl/dcerpc.idl         |   14 +-
 source3/include/proto.h       |   26 +-
 source3/include/rpc_dce.h     |   16 +-
 source3/rpc_client/cli_pipe.c |  804 +++++++++++++++++++++++++----------------
 source3/rpc_parse/parse_rpc.c |  137 +-------
 source3/rpc_server/srv_pipe.c |  139 ++++----
 6 files changed, 612 insertions(+), 524 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/dcerpc.idl b/librpc/idl/dcerpc.idl
index 3dfe972..68def36 100644
--- a/librpc/idl/dcerpc.idl
+++ b/librpc/idl/dcerpc.idl
@@ -19,7 +19,7 @@ interface dcerpc
 		ndr_syntax_id transfer_syntaxes[num_transfer_syntaxes];
 	} dcerpc_ctx_list;
 
-	typedef struct {
+	typedef [public] struct {
 		uint16 max_xmit_frag;
 		uint16 max_recv_frag;
 		uint32 assoc_group_id;
@@ -317,6 +317,18 @@ interface dcerpc
 	/* little-endian flag */
 	const uint8 DCERPC_DREP_LE  = 0x10;
 
+	/* header only version of ncacn_packet */
+	typedef [public] struct {
+		uint8 rpc_vers;	        /* RPC version */
+		uint8 rpc_vers_minor;   /* Minor version */
+		dcerpc_pkt_type ptype;  /* Packet type */
+		uint8 pfc_flags;        /* Fragmentation flags */
+		uint8 drep[4];	        /* NDR data representation */
+		uint16 frag_length;     /* Total length of fragment */
+		uint16 auth_length;     /* authenticator length */
+		uint32 call_id;	        /* Call identifier */
+	} ncacn_packet_header;
+
 	typedef [public] struct {
 		uint8 rpc_vers;	        /* RPC version */
 		uint8 rpc_vers_minor;   /* Minor version */
diff --git a/source3/include/proto.h b/source3/include/proto.h
index ee6f446..d08dc59 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4833,6 +4833,20 @@ struct tevent_req *rpc_api_pipe_req_send(TALLOC_CTX *mem_ctx,
 					 prs_struct *req_data);
 NTSTATUS rpc_api_pipe_req_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
 			       prs_struct *reply_pdu);
+NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx,
+				  enum dcerpc_pkt_type ptype,
+				  uint8_t pfc_flags,
+				  uint16_t frag_length,
+				  uint16_t auth_length,
+				  uint32_t call_id,
+				  union dcerpc_payload u,
+				  DATA_BLOB *blob);
+NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx,
+				  const DATA_BLOB *blob,
+				  struct ncacn_packet *r);
+NTSTATUS dcerpc_pull_ncacn_packet_header(TALLOC_CTX *mem_ctx,
+					 const DATA_BLOB *blob,
+					 struct ncacn_packet_header *r);
 struct tevent_req *rpc_pipe_bind_send(TALLOC_CTX *mem_ctx,
 				      struct event_context *ev,
 				      struct rpc_pipe_client *cli,
@@ -5064,14 +5078,9 @@ const char *get_pipe_name_from_syntax(TALLOC_CTX *mem_ctx,
 void init_rpc_hdr(RPC_HDR *hdr, enum dcerpc_pkt_type pkt_type, uint8 flags,
 				uint32 call_id, int data_len, int auth_len);
 bool smb_io_rpc_hdr(const char *desc,  RPC_HDR *rpc, prs_struct *ps, int depth);
-void init_rpc_context(RPC_CONTEXT *rpc_ctx, uint16 context_id,
-		      const struct ndr_syntax_id *abstract,
-		      const struct ndr_syntax_id *transfer);
-void init_rpc_hdr_rb(RPC_HDR_RB *rpc, 
-				uint16 max_tsize, uint16 max_rsize, uint32 assoc_gid,
-				RPC_CONTEXT *context);
-bool smb_io_rpc_context(const char *desc, RPC_CONTEXT *rpc_ctx, prs_struct *ps, int depth);
-bool smb_io_rpc_hdr_rb(const char *desc, RPC_HDR_RB *rpc, prs_struct *ps, int depth);
+NTSTATUS dcerpc_pull_dcerpc_bind(TALLOC_CTX *mem_ctx,
+				 const DATA_BLOB *blob,
+				 struct dcerpc_bind *r);
 void init_rpc_hdr_ba(RPC_HDR_BA *rpc, 
 				uint16 max_tsize, uint16 max_rsize, uint32 assoc_gid,
 				const char *pipe_addr,
@@ -5081,7 +5090,6 @@ bool smb_io_rpc_hdr_ba(const char *desc, RPC_HDR_BA *rpc, prs_struct *ps, int de
 void init_rpc_hdr_req(RPC_HDR_REQ *hdr, uint32 alloc_hint, uint16 opnum);
 bool smb_io_rpc_hdr_req(const char *desc, RPC_HDR_REQ *rpc, prs_struct *ps, int depth);
 bool smb_io_rpc_hdr_resp(const char *desc, RPC_HDR_RESP *rpc, prs_struct *ps, int depth);
-bool smb_io_rpc_hdr_fault(const char *desc, RPC_HDR_FAULT *rpc, prs_struct *ps, int depth);
 void init_rpc_hdr_auth(RPC_HDR_AUTH *rai,
 				uint8 auth_type, uint8 auth_level,
 				uint8 auth_pad_len,
diff --git a/source3/include/rpc_dce.h b/source3/include/rpc_dce.h
index 3fd833c..ade4728 100644
--- a/source3/include/rpc_dce.h
+++ b/source3/include/rpc_dce.h
@@ -107,20 +107,6 @@ typedef struct rpc_hdr_auth_info {
 
 #define RPC_HDR_AUTH_LEN 8
 
-typedef struct rpc_context {
-	uint16 context_id;		/* presentation context identifier. */
-	uint8 num_transfer_syntaxes;	/* the number of syntaxes */
-	struct ndr_syntax_id abstract;	/* num and vers. of interface client is using */
-	struct ndr_syntax_id *transfer;	/* Array of transfer interfaces. */
-} RPC_CONTEXT;
-
-/* RPC_BIND_REQ - ms req bind */
-typedef struct rpc_bind_req_info {
-	RPC_HDR_BBA bba;
-	uint8 num_contexts;    /* the number of contexts */
-	RPC_CONTEXT *rpc_context;
-} RPC_HDR_RB;
-
 /* 
  * The following length is 8 bytes RPC_HDR_BBA_LEN + 
  * 4 bytes size of context count +
@@ -129,7 +115,7 @@ typedef struct rpc_bind_req_info {
  */
 
 #define RPC_HDR_RB_LEN(rpc_hdr_rb) (RPC_HDR_BBA_LEN + 4 + \
-	((rpc_hdr_rb)->num_contexts) * (4 + RPC_IFACE_LEN + (((rpc_hdr_rb)->rpc_context->num_transfer_syntaxes)*RPC_IFACE_LEN)))
+	((rpc_hdr_rb)->num_contexts) * (4 + RPC_IFACE_LEN + (((rpc_hdr_rb)->ctx_list->num_transfer_syntaxes)*RPC_IFACE_LEN)))
 
 /* RPC_RESULTS - can only cope with one reason, right now... */
 typedef struct rpc_results_info {
diff --git a/source3/rpc_client/cli_pipe.c b/source3/rpc_client/cli_pipe.c
index c7ac02d..9d3dc72 100644
--- a/source3/rpc_client/cli_pipe.c
+++ b/source3/rpc_client/cli_pipe.c
@@ -41,6 +41,7 @@
 #include "smb_krb5.h"
 #include "../libcli/auth/ntlmssp.h"
 #include "rpc_client/cli_netlogon.h"
+#include "librpc/gen_ndr/ndr_dcerpc.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_CLI
@@ -293,6 +294,134 @@ static bool rpc_grow_buffer(prs_struct *pdu, size_t size)
 	return true;
 }
 
+/*******************************************************************
+*******************************************************************/
+
+NTSTATUS dcerpc_push_ncacn_packet(TALLOC_CTX *mem_ctx,
+				  enum dcerpc_pkt_type ptype,
+				  uint8_t pfc_flags,
+				  uint16_t frag_length,
+				  uint16_t auth_length,
+				  uint32_t call_id,
+				  union dcerpc_payload u,
+				  DATA_BLOB *blob)
+{
+	struct ncacn_packet r;
+	enum ndr_err_code ndr_err;
+
+	r.rpc_vers		= 5;
+	r.rpc_vers_minor	= 0;
+	r.ptype			= ptype;
+	r.pfc_flags		= pfc_flags;
+	r.drep[0]		= DCERPC_DREP_LE;
+	r.drep[1]		= 0;
+	r.drep[2]		= 0;
+	r.drep[3]		= 0;
+	r.frag_length		= frag_length;
+	r.auth_length		= auth_length;
+	r.call_id		= call_id;
+	r.u			= u;
+
+	ndr_err = ndr_push_struct_blob(blob, mem_ctx, &r,
+		(ndr_push_flags_fn_t)ndr_push_ncacn_packet);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(ncacn_packet, &r);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
+*******************************************************************/
+
+NTSTATUS dcerpc_pull_ncacn_packet(TALLOC_CTX *mem_ctx,
+				  const DATA_BLOB *blob,
+				  struct ncacn_packet *r)
+{
+	enum ndr_err_code ndr_err;
+
+	ndr_err = ndr_pull_struct_blob(blob, mem_ctx, r,
+		(ndr_pull_flags_fn_t)ndr_pull_ncacn_packet);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(ncacn_packet, r);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
+*******************************************************************/
+
+NTSTATUS dcerpc_pull_ncacn_packet_header(TALLOC_CTX *mem_ctx,
+					 const DATA_BLOB *blob,
+					 struct ncacn_packet_header *r)
+{
+	enum ndr_err_code ndr_err;
+
+	ndr_err = ndr_pull_struct_blob(blob, mem_ctx, r,
+		(ndr_pull_flags_fn_t)ndr_pull_ncacn_packet_header);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(ncacn_packet_header, r);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
+ ********************************************************************/
+
+static NTSTATUS dcerpc_push_schannel_bind(TALLOC_CTX *mem_ctx,
+					  struct NL_AUTH_MESSAGE *r,
+					  DATA_BLOB *blob)
+{
+	enum ndr_err_code ndr_err;
+
+	ndr_err = ndr_push_struct_blob(blob, mem_ctx, r,
+		(ndr_push_flags_fn_t)ndr_push_NL_AUTH_MESSAGE);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(NL_AUTH_MESSAGE, r);
+	}
+
+	return NT_STATUS_OK;
+}
+
+/*******************************************************************
+ ********************************************************************/
+
+static NTSTATUS dcerpc_pull_dcerpc_auth(TALLOC_CTX *mem_ctx,
+					const DATA_BLOB *blob,
+					struct dcerpc_auth *r)
+{
+	enum ndr_err_code ndr_err;
+
+	ndr_err = ndr_pull_struct_blob(blob, mem_ctx, r,
+		(ndr_pull_flags_fn_t)ndr_pull_dcerpc_auth);
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+		return ndr_map_error2ntstatus(ndr_err);
+	}
+
+	if (DEBUGLEVEL >= 10) {
+		NDR_PRINT_DEBUG(dcerpc_auth, r);
+	}
+
+	return NT_STATUS_OK;
+}
 
 /*******************************************************************
  Use SMBreadX to get rest of one fragment's worth of rpc data.
@@ -460,22 +589,34 @@ static NTSTATUS rpc_write_recv(struct tevent_req *req)
 
 
 static NTSTATUS parse_rpc_header(struct rpc_pipe_client *cli,
-				 struct rpc_hdr_info *prhdr,
+				 struct ncacn_packet_header *prhdr,
 				 prs_struct *pdu)
 {
+	NTSTATUS status;
+	DATA_BLOB blob = data_blob_const(prs_data_p(pdu), prs_data_size(pdu));
+
 	/*
 	 * This next call sets the endian bit correctly in current_pdu. We
 	 * will propagate this to rbuf later.
 	 */
 
-	if(!smb_io_rpc_hdr("rpc_hdr   ", prhdr, pdu, 0)) {
-		DEBUG(0, ("get_current_pdu: Failed to unmarshall RPC_HDR.\n"));
+	status = dcerpc_pull_ncacn_packet_header(cli, &blob, prhdr);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
+
+	if (!prs_set_offset(pdu, prs_offset(pdu) + RPC_HEADER_LEN)) {
 		return NT_STATUS_BUFFER_TOO_SMALL;
 	}
 
-	if (prhdr->frag_len > cli->max_recv_frag) {
+	if (UNMARSHALLING(pdu) && prhdr->drep[0] == 0) {
+		DEBUG(10,("parse_rpc_header: PDU data format is big-endian. Setting flag.\n"));
+		prs_set_endian_data(pdu, RPC_BIG_ENDIAN);
+	}
+
+	if (prhdr->frag_length > cli->max_recv_frag) {
 		DEBUG(0, ("cli_pipe_get_current_pdu: Server sent fraglen %d,"
-			  " we only allow %d\n", (int)prhdr->frag_len,
+			  " we only allow %d\n", (int)prhdr->frag_length,
 			  (int)cli->max_recv_frag));
 		return NT_STATUS_BUFFER_TOO_SMALL;
 	}
@@ -491,7 +632,7 @@ static NTSTATUS parse_rpc_header(struct rpc_pipe_client *cli,
 struct get_complete_frag_state {
 	struct event_context *ev;
 	struct rpc_pipe_client *cli;
-	struct rpc_hdr_info *prhdr;
+	struct ncacn_packet_header *prhdr;
 	prs_struct *pdu;
 };
 
@@ -501,7 +642,7 @@ static void get_complete_frag_got_rest(struct tevent_req *subreq);
 static struct tevent_req *get_complete_frag_send(TALLOC_CTX *mem_ctx,
 						 struct event_context *ev,
 						 struct rpc_pipe_client *cli,
-						 struct rpc_hdr_info *prhdr,
+						 struct ncacn_packet_header *prhdr,
 						 prs_struct *pdu)
 {
 	struct tevent_req *req, *subreq;
@@ -547,15 +688,15 @@ static struct tevent_req *get_complete_frag_send(TALLOC_CTX *mem_ctx,
 	/*
 	 * Ensure we have frag_len bytes of data.
 	 */
-	if (pdu_len < prhdr->frag_len) {
-		if (!rpc_grow_buffer(pdu, prhdr->frag_len)) {
+	if (pdu_len < prhdr->frag_length) {
+		if (!rpc_grow_buffer(pdu, prhdr->frag_length)) {
 			status = NT_STATUS_NO_MEMORY;
 			goto post_status;
 		}
 		subreq = rpc_read_send(state, state->ev,
 				       state->cli->transport,
 				       (uint8_t *)(prs_data_p(pdu) + pdu_len),
-				       prhdr->frag_len - pdu_len);
+				       prhdr->frag_length - pdu_len);
 		if (subreq == NULL) {
 			status = NT_STATUS_NO_MEMORY;
 			goto post_status;
@@ -596,7 +737,7 @@ static void get_complete_frag_got_header(struct tevent_req *subreq)
 		return;
 	}
 
-	if (!rpc_grow_buffer(state->pdu, state->prhdr->frag_len)) {
+	if (!rpc_grow_buffer(state->pdu, state->prhdr->frag_length)) {
 		tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
 		return;
 	}
@@ -609,7 +750,7 @@ static void get_complete_frag_got_header(struct tevent_req *subreq)
 	subreq = rpc_read_send(
 		state, state->ev, state->cli->transport,
 		(uint8_t *)(prs_data_p(state->pdu) + RPC_HEADER_LEN),
-		state->prhdr->frag_len - RPC_HEADER_LEN);
+		state->prhdr->frag_length - RPC_HEADER_LEN);
 	if (tevent_req_nomem(subreq, req)) {
 		return;
 	}
@@ -642,19 +783,21 @@ static NTSTATUS get_complete_frag_recv(struct tevent_req *req)
  In fact I should probably abstract these into identical pieces of code... JRA.
  ****************************************************************************/
 
-static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli, RPC_HDR *prhdr,
+static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli,
+				struct ncacn_packet_header *prhdr,
 				prs_struct *current_pdu,
 				uint8 *p_ss_padding_len)
 {
-	RPC_HDR_AUTH auth_info;
+	struct dcerpc_auth auth_info;
 	uint32 save_offset = prs_offset(current_pdu);
-	uint32 auth_len = prhdr->auth_len;
+	uint32_t auth_len = prhdr->auth_length;
 	struct ntlmssp_state *ntlmssp_state = cli->auth->a_u.ntlmssp_state;
 	unsigned char *data = NULL;
 	size_t data_len;
 	unsigned char *full_packet_data = NULL;
 	size_t full_packet_data_len;
 	DATA_BLOB auth_blob;
+	DATA_BLOB blob;
 	NTSTATUS status;
 
 	if (cli->auth->auth_level == DCERPC_AUTH_LEVEL_NONE
@@ -668,8 +811,9 @@ static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli, RPC_HDR *pr
 
 	/* Ensure there's enough data for an authenticated response. */
 	if (auth_len > RPC_MAX_PDU_FRAG_LEN ||
-			prhdr->frag_len < RPC_HEADER_LEN + RPC_HDR_RESP_LEN +
-					RPC_HDR_AUTH_LEN + auth_len) {
+			prhdr->frag_length < RPC_HEADER_LEN +
+					     RPC_HDR_RESP_LEN +
+					     RPC_HDR_AUTH_LEN + auth_len) {
 		DEBUG(0,("cli_pipe_verify_ntlmssp: auth_len %u is too large.\n",
 			(unsigned int)auth_len ));
 		return NT_STATUS_BUFFER_TOO_SMALL;
@@ -683,39 +827,42 @@ static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli, RPC_HDR *pr
 	 */
 
 	data = (unsigned char *)(prs_data_p(current_pdu) + RPC_HEADER_LEN + RPC_HDR_RESP_LEN);
-	data_len = (size_t)(prhdr->frag_len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len);
+	data_len = (size_t)(prhdr->frag_length - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len);
 
 	full_packet_data = (unsigned char *)prs_data_p(current_pdu);
-	full_packet_data_len = prhdr->frag_len - auth_len;
+	full_packet_data_len = prhdr->frag_length - auth_len;
 
 	/* Pull the auth header and the following data into a blob. */
         /* NB. The offset of the auth_header is relative to the *end*
 	 * of the packet, not the start. */
-	if(!prs_set_offset(current_pdu, prhdr->frag_len - RPC_HDR_AUTH_LEN - auth_len)) {
+	if(!prs_set_offset(current_pdu, prhdr->frag_length - RPC_HDR_AUTH_LEN - auth_len)) {
 		DEBUG(0,("cli_pipe_verify_ntlmssp: cannot move offset to %u.\n",
 			(unsigned int)RPC_HEADER_LEN + (unsigned int)RPC_HDR_RESP_LEN + (unsigned int)data_len ));
 		return NT_STATUS_BUFFER_TOO_SMALL;
         }
 
-	if(!smb_io_rpc_hdr_auth("hdr_auth", &auth_info, current_pdu, 0)) {
-		DEBUG(0,("cli_pipe_verify_ntlmssp: failed to unmarshall RPC_HDR_AUTH.\n"));
-		return NT_STATUS_BUFFER_TOO_SMALL;
+	blob = data_blob_const(prs_data_p(current_pdu) + prs_offset(current_pdu),
+			       prs_data_size(current_pdu) - prs_offset(current_pdu));
+
+	status = dcerpc_pull_dcerpc_auth(cli, &blob, &auth_info);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("cli_pipe_verify_ntlmssp: failed to unmarshall dcerpc_auth.\n"));
+		return status;
 	}
 
 	/* Ensure auth_pad_len fits into the packet. */
-	if (RPC_HEADER_LEN + RPC_HDR_REQ_LEN + auth_info.auth_pad_len +
-			RPC_HDR_AUTH_LEN + auth_len > prhdr->frag_len) {
+	if (RPC_HEADER_LEN + RPC_HDR_REQ_LEN + auth_info.auth_pad_length +
+			RPC_HDR_AUTH_LEN + auth_len > prhdr->frag_length) {
 		DEBUG(0,("cli_pipe_verify_ntlmssp: auth_info.auth_pad_len "
 			"too large (%u), auth_len (%u), frag_len = (%u).\n",
-			(unsigned int)auth_info.auth_pad_len,
+			(unsigned int)auth_info.auth_pad_length,
 			(unsigned int)auth_len,
-			(unsigned int)prhdr->frag_len ));
+			(unsigned int)prhdr->frag_length));
 		return NT_STATUS_BUFFER_TOO_SMALL;
 	}
 
 
-	auth_blob.data = (unsigned char *)prs_data_p(current_pdu) + prs_offset(current_pdu);
-	auth_blob.length = auth_len;
+	auth_blob = auth_info.credentials;
 
 	switch (cli->auth->auth_level) {
 		case DCERPC_AUTH_LEVEL_PRIVACY:
@@ -769,7 +916,7 @@ static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli, RPC_HDR *pr
 	 * stream once the sign/seal is done.
 	 */
 
-	*p_ss_padding_len = auth_info.auth_pad_len;
+	*p_ss_padding_len = auth_info.auth_pad_length;
 
 	return NT_STATUS_OK;
 }
@@ -778,12 +925,13 @@ static NTSTATUS cli_pipe_verify_ntlmssp(struct rpc_pipe_client *cli, RPC_HDR *pr
  schannel specific sign/seal.
  ****************************************************************************/
 
-static NTSTATUS cli_pipe_verify_schannel(struct rpc_pipe_client *cli, RPC_HDR *prhdr,
+static NTSTATUS cli_pipe_verify_schannel(struct rpc_pipe_client *cli,
+				struct ncacn_packet_header *prhdr,
 				prs_struct *current_pdu,
 				uint8 *p_ss_padding_len)
 {
 	RPC_HDR_AUTH auth_info;
-	uint32 auth_len = prhdr->auth_len;
+	uint32_t auth_len = prhdr->auth_length;
 	uint32 save_offset = prs_offset(current_pdu);
 	struct schannel_state *schannel_auth =
 		cli->auth->a_u.schannel_auth;
@@ -808,22 +956,22 @@ static NTSTATUS cli_pipe_verify_schannel(struct rpc_pipe_client *cli, RPC_HDR *p
 
 	/* Ensure there's enough data for an authenticated response. */
 	if ((auth_len > RPC_MAX_PDU_FRAG_LEN) ||
-			(RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_AUTH_LEN + auth_len > prhdr->frag_len)) {
+			(RPC_HEADER_LEN + RPC_HDR_RESP_LEN + RPC_HDR_AUTH_LEN + auth_len > prhdr->frag_length)) {
 		DEBUG(0,("cli_pipe_verify_schannel: auth_len %u is too large.\n",
 			(unsigned int)auth_len ));
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	data_len = prhdr->frag_len - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len;
+	data_len = prhdr->frag_length - RPC_HEADER_LEN - RPC_HDR_RESP_LEN - RPC_HDR_AUTH_LEN - auth_len;
 
         /* Pull the auth header and the following data into a blob. */
 	/* NB. The offset of the auth_header is relative to the *end*
 	 * of the packet, not the start. */
 	if(!prs_set_offset(current_pdu,
-			prhdr->frag_len - RPC_HDR_AUTH_LEN - auth_len)) {
+			prhdr->frag_length - RPC_HDR_AUTH_LEN - auth_len)) {
 		DEBUG(0,("cli_pipe_verify_schannel: cannot move "
 			"offset to %u.\n",
-			(unsigned int)(prhdr->frag_len -
+			(unsigned int)(prhdr->frag_length -


-- 
Samba Shared Repository


More information about the samba-cvs mailing list