[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