diff options
-rw-r--r-- | source3/rpc_parse/parse_prs.c | 17 | ||||
-rw-r--r-- | source3/rpc_server/srv_pipe_hnd.c | 4 |
2 files changed, 12 insertions, 9 deletions
diff --git a/source3/rpc_parse/parse_prs.c b/source3/rpc_parse/parse_prs.c index e8103ad866..bc9202cccc 100644 --- a/source3/rpc_parse/parse_prs.c +++ b/source3/rpc_parse/parse_prs.c @@ -267,12 +267,12 @@ bool prs_grow(prs_struct *ps, uint32 extra_space) extra_space -= (ps->buffer_size - ps->data_offset); if(ps->buffer_size == 0) { + /* - * Ensure we have at least a PDU's length, or extra_space, whichever - * is greater. + * Start with 128 bytes (arbitrary value), enough for small rpc + * requests */ - - new_size = MAX(RPC_MAX_PDU_FRAG_LEN,extra_space); + new_size = MAX(128, extra_space); if((ps->data_p = (char *)SMB_MALLOC(new_size)) == NULL) { DEBUG(0,("prs_grow: Malloc failure for size %u.\n", (unsigned int)new_size)); @@ -281,10 +281,13 @@ bool prs_grow(prs_struct *ps, uint32 extra_space) memset(ps->data_p, '\0', (size_t)new_size ); } else { /* - * If the current buffer size is bigger than the space needed, just - * double it, else add extra_space. + * If the current buffer size is bigger than the space needed, + * just double it, else add extra_space. Always keep 64 bytes + * more, so that after we added a large blob we don't have to + * realloc immediately again. */ - new_size = MAX(ps->buffer_size*2, ps->buffer_size + extra_space); + new_size = MAX(ps->buffer_size*2, + ps->buffer_size + extra_space + 64); if ((ps->data_p = (char *)SMB_REALLOC(ps->data_p, new_size)) == NULL) { DEBUG(0,("prs_grow: Realloc failure for size %u.\n", diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index 56c4a317e5..313c49a5e1 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -77,7 +77,7 @@ static bool pipe_init_outgoing_data(pipes_struct *p) * 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, RPC_MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) { + if(!prs_init(&o_data->rdata, 128, p->mem_ctx, MARSHALL)) { DEBUG(0,("pipe_init_outgoing_data: malloc fail.\n")); return False; } @@ -128,7 +128,7 @@ static struct pipes_struct *make_internal_rpc_pipe_p(TALLOC_CTX *mem_ctx, * change the type to UNMARSALLING before processing the stream. */ - if(!prs_init(&p->in_data.data, RPC_MAX_PDU_FRAG_LEN, p->mem_ctx, MARSHALL)) { + if(!prs_init(&p->in_data.data, 128, p->mem_ctx, MARSHALL)) { DEBUG(0,("open_rpc_pipe_p: malloc fail for in_data struct.\n")); talloc_destroy(p->mem_ctx); close_policy_by_pipe(p); |