summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2008-07-03 13:39:55 +0200
committerStefan Metzmacher <metze@samba.org>2008-07-03 15:49:56 +0200
commit8bd7dabb072942ed0955c8b2e26ee41c3edae0bf (patch)
tree2e225245cd98b0793768e9483dc2dfcb3c137565
parentd8ac9bde86f349fecb997a2c8c4d0e2cbfe22542 (diff)
downloadsamba-8bd7dabb072942ed0955c8b2e26ee41c3edae0bf.tar.gz
samba-8bd7dabb072942ed0955c8b2e26ee41c3edae0bf.tar.bz2
samba-8bd7dabb072942ed0955c8b2e26ee41c3edae0bf.zip
rpc_server: use the same chunk_size logic as we we use in the client
metze (This used to be commit 9ff0ce42b32bf0f1463d2cb9c2a6595f51b13d04)
-rw-r--r--source4/rpc_server/dcerpc_server.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index e0351bb259..d8dafd61f6 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -886,7 +886,7 @@ _PUBLIC_ NTSTATUS dcesrv_reply(struct dcesrv_call_state *call)
struct ndr_push *push;
NTSTATUS status;
DATA_BLOB stub;
- uint32_t total_length;
+ uint32_t total_length, chunk_size;
struct dcesrv_connection_context *context = call->context;
/* call the reply function */
@@ -917,20 +917,20 @@ _PUBLIC_ NTSTATUS dcesrv_reply(struct dcesrv_call_state *call)
total_length = stub.length;
+ /* we can write a full max_recv_frag size, minus the dcerpc
+ request header size */
+ chunk_size = call->conn->cli_max_recv_frag - (DCERPC_MAX_SIGN_SIZE+DCERPC_REQUEST_LENGTH);
+
do {
uint32_t length;
struct data_blob_list_item *rep;
struct ncacn_packet pkt;
+ const uint32_t overhead = (DCERPC_MAX_SIGN_SIZE+DCERPC_RESPONSE_LENGTH);
rep = talloc(call, struct data_blob_list_item);
NT_STATUS_HAVE_NO_MEMORY(rep);
- length = stub.length;
- if (length + DCERPC_RESPONSE_LENGTH > call->conn->cli_max_recv_frag) {
- /* the 32 is to cope with signing data */
- length = call->conn->cli_max_recv_frag -
- (DCERPC_MAX_SIGN_SIZE+DCERPC_RESPONSE_LENGTH);
- }
+ length = MIN(chunk_size, stub.length);
/* form the dcerpc response packet */
dcesrv_init_hdr(&pkt, lp_rpc_big_endian(call->conn->dce_ctx->lp_ctx));