summaryrefslogtreecommitdiff
path: root/source3/rpc_server/srv_pipe_hnd.c
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2010-07-15 10:28:59 -0400
committerGünther Deschner <gd@samba.org>2010-07-16 01:51:18 +0200
commit100d37fc4624690423f6a932709b3f9046d05c64 (patch)
tree282b8a75e561fedef7db3bd5c27df74cd95c5ef6 /source3/rpc_server/srv_pipe_hnd.c
parent8f2bfa88b5846528aa78840979a8ce8babef2cc0 (diff)
downloadsamba-100d37fc4624690423f6a932709b3f9046d05c64.tar.gz
samba-100d37fc4624690423f6a932709b3f9046d05c64.tar.bz2
samba-100d37fc4624690423f6a932709b3f9046d05c64.zip
s3-dcerpc: Use DATA_BLOB for pipes_struct input data
Signed-off-by: Günther Deschner <gd@samba.org>
Diffstat (limited to 'source3/rpc_server/srv_pipe_hnd.c')
-rw-r--r--source3/rpc_server/srv_pipe_hnd.c62
1 files changed, 14 insertions, 48 deletions
diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c
index f2fb76ea49..3055e1a29c 100644
--- a/source3/rpc_server/srv_pipe_hnd.c
+++ b/source3/rpc_server/srv_pipe_hnd.c
@@ -56,7 +56,7 @@ static bool pipe_init_outgoing_data(pipes_struct *p)
static void set_incoming_fault(pipes_struct *p)
{
- prs_mem_free(&p->in_data.data);
+ data_blob_free(&p->in_data.data);
p->in_data.pdu_needed_len = 0;
p->in_data.pdu.length = 0;
p->fault_state = True;
@@ -145,21 +145,12 @@ static void free_pipe_context(pipes_struct *p)
{
data_blob_free(&p->out_data.frag);
data_blob_free(&p->out_data.rdata);
- prs_mem_free(&p->in_data.data);
+ data_blob_free(&p->in_data.data);
DEBUG(3, ("free_pipe_context: "
"destroying talloc pool of size %lu\n",
(unsigned long)talloc_total_size(p->mem_ctx)));
talloc_free_children(p->mem_ctx);
- /*
- * Re-initialize to set back to marshalling and set the
- * offset back to the start of the buffer.
- */
- if(!prs_init(&p->in_data.data, 128, p->mem_ctx, MARSHALL)) {
- DEBUG(0, ("free_pipe_context: "
- "rps_init failed!\n"));
- p->fault_state = True;
- }
}
/****************************************************************************
@@ -348,10 +339,10 @@ static bool process_request_pdu(pipes_struct *p, struct ncacn_packet *pkt)
* will not fit in the initial buffer of size 0x1068 --jerry 22/01/2002
*/
- if (prs_offset(&p->in_data.data) + data.length > MAX_RPC_DATA_SIZE) {
+ if (p->in_data.data.length + data.length > MAX_RPC_DATA_SIZE) {
DEBUG(0, ("process_request_pdu: "
"rpc data buffer too large (%u) + (%u)\n",
- (unsigned int)prs_data_size(&p->in_data.data),
+ (unsigned int)p->in_data.data.length,
(unsigned int)data.length));
set_incoming_fault(p);
return False;
@@ -361,14 +352,16 @@ static bool process_request_pdu(pipes_struct *p, struct ncacn_packet *pkt)
* Append the data portion into the buffer and return.
*/
- if (!prs_copy_data_in(&p->in_data.data,
- (char *)data.data, data.length)) {
- DEBUG(0, ("process_request_pdu: Unable to append data size %u "
- "to parse buffer of size %u.\n",
- (unsigned int)data.length,
- (unsigned int)prs_data_size(&p->in_data.data)));
- set_incoming_fault(p);
- return False;
+ if (data.length) {
+ if (!data_blob_append(p->mem_ctx, &p->in_data.data,
+ data.data, data.length)) {
+ DEBUG(0, ("Unable to append data size %u "
+ "to parse buffer of size %u.\n",
+ (unsigned int)data.length,
+ (unsigned int)p->in_data.data.length));
+ set_incoming_fault(p);
+ return False;
+ }
}
if (pkt->pfc_flags & DCERPC_PFC_FLAG_LAST) {
@@ -379,30 +372,8 @@ static bool process_request_pdu(pipes_struct *p, struct ncacn_packet *pkt)
*/
/*
- * Ensure the internal prs buffer size is *exactly* the same
- * size as the current offset.
- */
-
- if (!prs_set_buffer_size(&p->in_data.data,
- prs_offset(&p->in_data.data))) {
- DEBUG(0, ("process_request_pdu: "
- "Call to prs_set_buffer_size failed!\n"));
- set_incoming_fault(p);
- return False;
- }
-
- /*
- * Set the parse offset to the start of the data and set the
- * prs_struct to UNMARSHALL.
- */
-
- prs_set_offset(&p->in_data.data, 0);
- prs_switch_type(&p->in_data.data, UNMARSHALL);
-
- /*
* Process the complete data stream here.
*/
-
if (pipe_init_outgoing_data(p)) {
ret = api_pipe_request(p, pkt);
}
@@ -454,7 +425,6 @@ static void process_complete_pdu(pipes_struct *p)
} else {
p->endian = RPC_BIG_ENDIAN;
}
- prs_set_endian_data(&p->in_data.data, p->endian);
DEBUG(10, ("Processing packet type %d\n", (int)pkt->ptype));
@@ -591,10 +561,6 @@ static void process_complete_pdu(pipes_struct *p)
}
done:
- /* Reset to little endian.
- * Probably don't need this but it won't hurt. */
- prs_set_endian_data(&p->in_data.data, RPC_LITTLE_ENDIAN);
-
if (!reply) {
DEBUG(3,("process_complete_pdu: DCE/RPC fault sent on "
"pipe %s\n", get_pipe_name_from_syntax(talloc_tos(),