s4:rpc_server: use a variable for the max total reassembled request payload
authorStefan Metzmacher <metze@samba.org>
Wed, 22 Jun 2016 15:18:28 +0000 (17:18 +0200)
committerAndrew Bartlett <abartlet@samba.org>
Thu, 23 Jun 2016 02:51:16 +0000 (04:51 +0200)
We still use the same limit of 4 MByte (DCERPC_NCACN_REQUEST_DEFAULT_MAX_SIZE)
by default.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=11948

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Thu Jun 23 04:51:16 CEST 2016 on sn-devel-144

source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h

index 36b3fd27c606c4b4080b107c98b7ff73e18d29a1..025cb2027cb3f8687c3e5e48fbeae01eb940435f 100644 (file)
@@ -408,6 +408,7 @@ _PUBLIC_ NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
        p->allow_bind = true;
        p->max_recv_frag = 5840;
        p->max_xmit_frag = 5840;
+       p->max_total_request_size = DCERPC_NCACN_REQUEST_DEFAULT_MAX_SIZE;
 
        *_p = p;
        return NT_STATUS_OK;
@@ -1532,7 +1533,7 @@ static NTSTATUS dcesrv_process_ncacn_packet(struct dcesrv_connection *dce_conn,
                /*
                 * Up to 4 MByte are allowed by all fragments
                 */
-               available = DCERPC_NCACN_PAYLOAD_MAX_SIZE;
+               available = dce_conn->max_total_request_size;
                if (er->stub_and_verifier.length > available) {
                        dcesrv_call_disconnect_after(existing,
                                "dcesrv_auth_request - existing payload too large");
@@ -1585,7 +1586,7 @@ static NTSTATUS dcesrv_process_ncacn_packet(struct dcesrv_connection *dce_conn,
                /*
                 * Up to 4 MByte are allowed by all fragments
                 */
-               if (call->pkt.u.request.alloc_hint > DCERPC_NCACN_PAYLOAD_MAX_SIZE) {
+               if (call->pkt.u.request.alloc_hint > dce_conn->max_total_request_size) {
                        dcesrv_call_disconnect_after(call,
                                "dcesrv_auth_request - initial alloc hint too large");
                        return dcesrv_fault(call, DCERPC_FAULT_ACCESS_DENIED);
index aead405edd1e40d510bc92b2619a64629ef841f0..54187ee749fb184811cdf17340a6b1a030665d4e 100644 (file)
@@ -278,6 +278,9 @@ struct dcesrv_connection {
 
        /* the association group the connection belongs to */
        struct dcesrv_assoc_group *assoc_group;
+
+       /* The maximum total payload of reassembled request pdus */
+       size_t max_total_request_size;
 };