[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha7-1001-g971c30a

Stefan Metzmacher metze at samba.org
Fri Apr 10 18:17:51 GMT 2009


The branch, master has been updated
       via  971c30a4fc3fa0e6f812234201fdb883fccffee7 (commit)
       via  225a4f7cc2b83bb84ca4022eaf9b0d92d35c3d80 (commit)
      from  f20f5ae8e6b9ca5c90441a3083f6904168388fdf (commit)

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


- Log -----------------------------------------------------------------
commit 971c30a4fc3fa0e6f812234201fdb883fccffee7
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 7 14:37:05 2009 +0200

    s4:rpc_server: split out the parsing of the ncacn_packet from analyzing of the content
    
    metze

commit 225a4f7cc2b83bb84ca4022eaf9b0d92d35c3d80
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Apr 7 21:02:55 2009 +0200

    s4:rpc_server: report available output for all replies
    
    metze

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

Summary of changes:
 source4/rpc_server/dcerpc_server.c |  113 +++++++++++++++++++++++++-----------
 1 files changed, 79 insertions(+), 34 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index d7bd760..c7f073c 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -467,6 +467,12 @@ static NTSTATUS dcesrv_fault(struct dcesrv_call_state *call, uint32_t fault_code
 	DLIST_ADD_END(call->replies, rep, struct data_blob_list_item *);
 	dcesrv_call_set_list(call, DCESRV_LIST_CALL_LIST);
 
+	if (call->conn->call_list && call->conn->call_list->replies) {
+		if (call->conn->transport.report_output_data) {
+			call->conn->transport.report_output_data(call->conn);
+		}
+	}
+
 	return NT_STATUS_OK;	
 }
 
@@ -506,6 +512,12 @@ static NTSTATUS dcesrv_bind_nak(struct dcesrv_call_state *call, uint32_t reason)
 	DLIST_ADD_END(call->replies, rep, struct data_blob_list_item *);
 	dcesrv_call_set_list(call, DCESRV_LIST_CALL_LIST);
 
+	if (call->conn->call_list && call->conn->call_list->replies) {
+		if (call->conn->transport.report_output_data) {
+			call->conn->transport.report_output_data(call->conn);
+		}
+	}
+
 	return NT_STATUS_OK;	
 }
 
@@ -706,6 +718,12 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call)
 	DLIST_ADD_END(call->replies, rep, struct data_blob_list_item *);
 	dcesrv_call_set_list(call, DCESRV_LIST_CALL_LIST);
 
+	if (call->conn->call_list && call->conn->call_list->replies) {
+		if (call->conn->transport.report_output_data) {
+			call->conn->transport.report_output_data(call->conn);
+		}
+	}
+
 	return NT_STATUS_OK;
 }
 
@@ -877,6 +895,12 @@ static NTSTATUS dcesrv_alter(struct dcesrv_call_state *call)
 	DLIST_ADD_END(call->replies, rep, struct data_blob_list_item *);
 	dcesrv_call_set_list(call, DCESRV_LIST_CALL_LIST);
 
+	if (call->conn->call_list && call->conn->call_list->replies) {
+		if (call->conn->transport.report_output_data) {
+			call->conn->transport.report_output_data(call->conn);
+		}
+	}
+
 	return NT_STATUS_OK;
 }
 
@@ -1111,17 +1135,17 @@ static int dcesrv_call_dequeue(struct dcesrv_call_state *call)
 /*
   process some input to a dcerpc endpoint server.
 */
-NTSTATUS dcesrv_input_process(struct dcesrv_connection *dce_conn)
+NTSTATUS dcesrv_process_ncacn_packet(struct dcesrv_connection *dce_conn,
+				     struct ncacn_packet *pkt,
+				     DATA_BLOB blob)
 {
-	struct ndr_pull *ndr;
-	enum ndr_err_code ndr_err;
 	NTSTATUS status;
 	struct dcesrv_call_state *call;
-	DATA_BLOB blob;
 
 	call = talloc_zero(dce_conn, struct dcesrv_call_state);
 	if (!call) {
-		talloc_free(dce_conn->partial_input.data);
+		data_blob_free(&blob);
+		talloc_free(pkt);
 		return NT_STATUS_NO_MEMORY;
 	}
 	call->conn		= dce_conn;
@@ -1131,43 +1155,19 @@ NTSTATUS dcesrv_input_process(struct dcesrv_connection *dce_conn)
 	call->time		= timeval_current();
 	call->list              = DCESRV_LIST_NONE;
 
-	talloc_set_destructor(call, dcesrv_call_dequeue);
-
-	blob = dce_conn->partial_input;
-	blob.length = dcerpc_get_frag_length(&blob);
-
-	ndr = ndr_pull_init_blob(&blob, call, lp_iconv_convenience(call->conn->dce_ctx->lp_ctx));
-	if (!ndr) {
-		talloc_free(dce_conn->partial_input.data);
-		talloc_free(call);
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	if (!(CVAL(blob.data, DCERPC_DREP_OFFSET) & DCERPC_DREP_LE)) {
-		ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
-	}
-
-	if (CVAL(blob.data, DCERPC_PFC_OFFSET) & DCERPC_PFC_FLAG_OBJECT_UUID) {
-		ndr->flags |= LIBNDR_FLAG_OBJECT_PRESENT;
-	}
+	talloc_steal(call, pkt);
+	talloc_steal(call, blob.data);
+	call->pkt = *pkt;
 
-	ndr_err = ndr_pull_ncacn_packet(ndr, NDR_SCALARS|NDR_BUFFERS, &call->pkt);
-	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
-		talloc_free(dce_conn->partial_input.data);
-		talloc_free(call);
-		return ndr_map_error2ntstatus(ndr_err);
-	}
+	talloc_set_destructor(call, dcesrv_call_dequeue);
 
 	/* we have to check the signing here, before combining the
 	   pdus */
 	if (call->pkt.ptype == DCERPC_PKT_REQUEST &&
 	    !dcesrv_auth_request(call, &blob)) {
-		dce_partial_advance(dce_conn, blob.length);
 		return dcesrv_fault(call, DCERPC_FAULT_ACCESS_DENIED);		
 	}
 
-	dce_partial_advance(dce_conn, blob.length);
-
 	/* see if this is a continued packet */
 	if (call->pkt.ptype == DCERPC_PKT_REQUEST &&
 	    !(call->pkt.pfc_flags & DCERPC_PFC_FLAG_FIRST)) {
@@ -1276,7 +1276,52 @@ _PUBLIC_ NTSTATUS dcesrv_input(struct dcesrv_connection *dce_conn, const DATA_BL
 	dce_conn->partial_input.length += data->length;
 
 	while (dce_full_packet(&dce_conn->partial_input)) {
-		status = dcesrv_input_process(dce_conn);
+		NTSTATUS status;
+		struct ndr_pull *ndr;
+		enum ndr_err_code ndr_err;
+		DATA_BLOB blob;
+		struct ncacn_packet *pkt;
+
+		blob = dce_conn->partial_input;
+		blob.length = dcerpc_get_frag_length(&blob);
+		blob = data_blob_talloc(dce_conn, blob.data, blob.length);
+		if (!blob.data) {
+			data_blob_free(&dce_conn->partial_input);
+			return NT_STATUS_NO_MEMORY;
+		}
+
+		dce_partial_advance(dce_conn, blob.length);
+
+		pkt = talloc(dce_conn, struct ncacn_packet);
+		if (!pkt) {
+			data_blob_free(&blob);
+			return NT_STATUS_NO_MEMORY;
+		}
+
+		ndr = ndr_pull_init_blob(&blob, pkt, lp_iconv_convenience(dce_conn->dce_ctx->lp_ctx));
+		if (!ndr) {
+			data_blob_free(&blob);
+			talloc_free(pkt);
+			return NT_STATUS_NO_MEMORY;
+		}
+
+		if (!(CVAL(blob.data, DCERPC_DREP_OFFSET) & DCERPC_DREP_LE)) {
+			ndr->flags |= LIBNDR_FLAG_BIGENDIAN;
+		}
+
+		if (CVAL(blob.data, DCERPC_PFC_OFFSET) & DCERPC_PFC_FLAG_OBJECT_UUID) {
+			ndr->flags |= LIBNDR_FLAG_OBJECT_PRESENT;
+		}
+
+		ndr_err = ndr_pull_ncacn_packet(ndr, NDR_SCALARS|NDR_BUFFERS, pkt);
+		TALLOC_FREE(ndr);
+		if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+			data_blob_free(&blob);
+			talloc_free(pkt);
+			return ndr_map_error2ntstatus(ndr_err);
+		}
+
+		status = dcesrv_process_ncacn_packet(dce_conn, pkt, blob);
 		if (!NT_STATUS_IS_OK(status)) {
 			return status;
 		}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list