pidl "\treturn false;";
pidl "}";
pidl "";
- pidl "blob = ndr_push_blob(push);";
- pidl "if (!prs_copy_data_in(&p->out_data.rdata, (const char *)blob.data, (uint32_t)blob.length)) {";
- pidl "\ttalloc_free(r);";
- pidl "\treturn false;";
- pidl "}";
+ pidl "p->out_data.rdata = ndr_push_blob(push);";
+ pidl "talloc_steal(p->mem_ctx, p->out_data.rdata.data);";
pidl "";
pidl "talloc_free(r);";
pidl "";
/*
* Raw RPC output data. This does not include RPC headers or footers.
*/
- prs_struct rdata;
+ DATA_BLOB rdata;
/* The amount of data sent from the current rdata struct. */
uint32 data_sent_length;
void prs_dump(const char *name, int v, prs_struct *ps);
void prs_dump_before(const char *name, int v, prs_struct *ps);
-void prs_dump_region(const char *name, int v, prs_struct *ps,
+void prs_dump_region(const char *name, int v, uint8_t *data_p,
int from_off, int to_off);
void prs_debug(prs_struct *ps, int depth, const char *desc, const char *fn_name);
bool prs_init(prs_struct *ps, uint32 size, TALLOC_CTX *ctx, bool io);
**/
void prs_dump(const char *name, int v, prs_struct *ps)
{
- prs_dump_region(name, v, ps, ps->data_offset, ps->buffer_size);
+ prs_dump_region(name, v,
+ (uint8_t *)ps->data_p,
+ ps->data_offset, ps->buffer_size);
}
/**
**/
void prs_dump_before(const char *name, int v, prs_struct *ps)
{
- prs_dump_region(name, v, ps, 0, ps->data_offset);
+ prs_dump_region(name, v,
+ (uint8_t *)ps->data_p,
+ 0, ps->data_offset);
}
/**
* Dump everything from the start of the prs up to the current location.
**/
-void prs_dump_region(const char *name, int v, prs_struct *ps,
+void prs_dump_region(const char *name, int v, uint8_t *data_p,
int from_off, int to_off)
{
int fd, i;
if (fd != -1 || errno != EEXIST) break;
}
if (fd != -1) {
- sz = write(fd, ps->data_p + from_off, to_off - from_off);
+ sz = write(fd, data_p + from_off, to_off - from_off);
i = close(fd);
if ( (sz != to_off-from_off) || (i != 0) ) {
DEBUG(0,("Error writing/closing %s: %ld!=%ld %d\n", fname, (unsigned long)sz, (unsigned long)to_off-from_off, i ));
p->endian = RPC_LITTLE_ENDIAN;
- /*
- * Initialize the outgoing RPC data buffer with no memory.
- */
- prs_init_empty(&p->out_data.rdata, p->mem_ctx, MARSHALL);
-
p->syntax = *syntax;
DEBUG(4,("Created internal pipe %s (pipes_open=%d)\n",
const struct ndr_interface_call *call;
struct ndr_pull *pull;
enum ndr_err_code ndr_err;
- DATA_BLOB blob;
- bool ret;
if (!ndr_syntax_id_equal(&table->syntax_id, &cli->abstract_syntax) ||
(opnum >= table->num_calls)) {
call = &table->calls[opnum];
- ret = prs_data_blob(&cli->pipes_struct->out_data.rdata, &blob, mem_ctx);
- if (!ret) {
- return NT_STATUS_NO_MEMORY;
- }
-
- pull = ndr_pull_init_blob(&blob, mem_ctx);
+ pull = ndr_pull_init_blob(&cli->pipes_struct->out_data.rdata,
+ mem_ctx);
if (pull == NULL) {
return NT_STATUS_NO_MEMORY;
}
return NT_STATUS_INVALID_PARAMETER;
}
- prs_init_empty(&cli->pipes_struct->out_data.rdata, cli->pipes_struct->mem_ctx, MARSHALL);
-
status = internal_ndr_push(mem_ctx, cli, table, opnum, r);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
prs_mem_free(&cli->pipes_struct->in_data.data);
- prs_mem_free(&cli->pipes_struct->out_data.rdata);
+ data_blob_free(&cli->pipes_struct->out_data.rdata);
return NT_STATUS_OK;
}
* Work out how much we can fit in a single PDU.
*/
- data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
+ data_len_left = p->out_data.rdata.length - p->out_data.data_sent_length;
/*
* Ensure there really is data left to send.
* Work out if this PDU will be the last.
*/
if (p->out_data.data_sent_length + data_len >=
- prs_offset(&p->out_data.rdata)) {
+ p->out_data.rdata.length) {
hdr_flags |= DCERPC_PFC_FLAG_LAST;
}
/* Set the data into the PDU. */
u.response.stub_and_verifier =
- data_blob_const(prs_data_p(&p->out_data.rdata), data_len);
+ data_blob_const(p->out_data.rdata.data, data_len);
status = dcerpc_push_ncacn_packet(
prs_get_mem_context(&p->out_data.frag),
* Work out how much we can fit in a single PDU.
*/
- data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
+ data_len_left = p->out_data.rdata.length - p->out_data.data_sent_length;
/*
* Ensure there really is data left to send.
* Work out if this PDU will be the last.
*/
if (p->out_data.data_sent_length + data_len >=
- prs_offset(&p->out_data.rdata)) {
+ p->out_data.rdata.length) {
hdr_flags |= DCERPC_PFC_FLAG_LAST;
}
/* Set the data into the PDU. */
u.response.stub_and_verifier =
- data_blob_const(prs_data_p(&p->out_data.rdata) +
+ data_blob_const(p->out_data.rdata.data +
p->out_data.data_sent_length, data_len);
status = dcerpc_push_ncacn_packet(
* Work out how much we can fit in a single PDU.
*/
- data_len_left = prs_offset(&p->out_data.rdata) - p->out_data.data_sent_length;
+ data_len_left = p->out_data.rdata.length - p->out_data.data_sent_length;
/*
* Ensure there really is data left to send.
/*
* Work out if this PDU will be the last.
*/
- if(p->out_data.data_sent_length + data_len >= prs_offset(&p->out_data.rdata)) {
+ if(p->out_data.data_sent_length + data_len >= p->out_data.rdata.length) {
hdr_flags |= DCERPC_PFC_FLAG_LAST;
}
/* Set the data into the PDU. */
u.response.stub_and_verifier =
- data_blob_const(prs_data_p(&p->out_data.rdata) +
+ data_blob_const(p->out_data.rdata.data +
p->out_data.data_sent_length, data_len);
status = dcerpc_push_ncacn_packet(
DATA_BLOB blob;
/* Free any memory in the current return data buffer. */
- prs_mem_free(&p->out_data.rdata);
+ data_blob_free(&p->out_data.rdata);
/*
* Marshall directly into the outgoing PDU space. We
DATA_BLOB blob;
/* Free any memory in the current return data buffer. */
- prs_mem_free(&p->out_data.rdata);
+ data_blob_free(&p->out_data.rdata);
/*
* Marshall directly into the outgoing PDU space. We
((p->auth.auth_type == PIPE_AUTH_TYPE_NTLMSSP) ||
(p->auth.auth_type == PIPE_AUTH_TYPE_SPNEGO_NTLMSSP))) {
if(!become_authenticated_pipe_user(p)) {
- prs_mem_free(&p->out_data.rdata);
+ data_blob_free(&p->out_data.rdata);
return False;
}
changed_user = True;
const struct api_struct *api_rpc_cmds, int n_cmds)
{
int fn_num;
- uint32 offset1, offset2;
+ uint32_t offset1;
/* interpret the command */
DEBUG(4,("api_rpcTNP: %s op 0x%x - ",
return True;
}
- offset1 = prs_offset(&p->out_data.rdata);
+ offset1 = p->out_data.rdata.length;
DEBUG(6, ("api_rpc_cmds[%d].fn == %p\n",
fn_num, api_rpc_cmds[fn_num].fn));
DEBUG(0,("api_rpcTNP: %s: %s failed.\n",
get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
api_rpc_cmds[fn_num].name));
- prs_mem_free(&p->out_data.rdata);
+ data_blob_free(&p->out_data.rdata);
return False;
}
return True;
}
- offset2 = prs_offset(&p->out_data.rdata);
- prs_set_offset(&p->out_data.rdata, offset1);
if (DEBUGLEVEL >= 50) {
fstring name;
slprintf(name, sizeof(name)-1, "out_%s",
get_pipe_name_from_syntax(talloc_tos(), &p->syntax));
- prs_dump(name, pkt->u.request.opnum, &p->out_data.rdata);
+ prs_dump_region(name, pkt->u.request.opnum,
+ p->out_data.rdata.data,
+ offset1,
+ p->out_data.rdata.length);
}
- prs_set_offset(&p->out_data.rdata, offset2);
DEBUG(5,("api_rpcTNP: called %s successfully\n",
get_pipe_name_from_syntax(talloc_tos(), &p->syntax)));
prs_mem_free(&o_data->frag);
/* Free any memory in the current return data buffer. */
- prs_mem_free(&o_data->rdata);
-
- /*
- * Initialize the outgoing RPC data buffer.
- * we will use this as the raw data area for replying to rpc requests.
- */
- if(!prs_init(&o_data->rdata, 128, p->mem_ctx, MARSHALL)) {
- DEBUG(0,("pipe_init_outgoing_data: malloc fail.\n"));
- return False;
- }
+ data_blob_free(&o_data->rdata);
return True;
}
static void free_pipe_context(pipes_struct *p)
{
prs_mem_free(&p->out_data.frag);
- prs_mem_free(&p->out_data.rdata);
+ data_blob_free(&p->out_data.rdata);
prs_mem_free(&p->in_data.data);
DEBUG(3, ("free_pipe_context: "
*/
DEBUG(10,("read_from_pipe: %s: fault_state = %d : data_sent_length "
- "= %u, prs_offset(&p->out_data.rdata) = %u.\n",
+ "= %u, p->out_data.rdata.length = %u.\n",
get_pipe_name_from_syntax(talloc_tos(), &p->syntax),
(int)p->fault_state,
(unsigned int)p->out_data.data_sent_length,
- (unsigned int)prs_offset(&p->out_data.rdata) ));
+ (unsigned int)p->out_data.rdata.length));
- if(p->out_data.data_sent_length >= prs_offset(&p->out_data.rdata)) {
+ if (p->out_data.data_sent_length >= p->out_data.rdata.length) {
/*
* We have sent all possible data, return 0.
*/
p->out_data.current_pdu_sent = 0;
prs_mem_free(&p->out_data.frag);
- if (p->out_data.data_sent_length
- >= prs_offset(&p->out_data.rdata)) {
+ if (p->out_data.data_sent_length >= p->out_data.rdata.length) {
/*
* We're completely finished with both outgoing and
* incoming data streams. It's safe to free all
p.mem_ctx = talloc_stackframe();
p.in_data.data.buffer_size = state->request->extra_len;
p.in_data.data.data_p = state->request->extra_data.data;
- prs_init(&p.out_data.rdata, 0, state->mem_ctx, MARSHALL);
ret = fns[state->request->data.ndrcmd].fn(&p);
- TALLOC_FREE(p.mem_ctx);
if (!ret) {
+ TALLOC_FREE(p.mem_ctx);
return WINBINDD_ERROR;
}
state->response->extra_data.data =
- talloc_memdup(state->mem_ctx, p.out_data.rdata.data_p,
- p.out_data.rdata.data_offset);
- state->response->length += p.out_data.rdata.data_offset;
- prs_mem_free(&p.out_data.rdata);
+ talloc_move(state->mem_ctx, &p.out_data.rdata.data);
+ state->response->length += p.out_data.rdata.length;
+ p.out_data.rdata.length = 0;
+
+ TALLOC_FREE(p.mem_ctx);
+
if (state->response->extra_data.data == NULL) {
return WINBINDD_ERROR;
}