summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2003-12-14 12:21:21 +0000
committerAndrew Tridgell <tridge@samba.org>2003-12-14 12:21:21 +0000
commita05882b34beffae26723a6b22a467ab10ee28dfe (patch)
tree43d4d5adff04920d67c95e238cb1ddc3074ef842
parentb356f3e43e360a409cd30fac97a0902d9b7ef11f (diff)
downloadsamba-a05882b34beffae26723a6b22a467ab10ee28dfe.tar.gz
samba-a05882b34beffae26723a6b22a467ab10ee28dfe.tar.bz2
samba-a05882b34beffae26723a6b22a467ab10ee28dfe.zip
fixed fragmented signed connections to our rpc server over SMB
(This used to be commit f5df126c254bcb96dfb42096d7247215c7e7a89a)
-rw-r--r--source4/librpc/idl/dcerpc.idl1
-rw-r--r--source4/librpc/rpc/dcerpc.c2
-rw-r--r--source4/rpc_server/dcerpc_server.c4
3 files changed, 5 insertions, 2 deletions
diff --git a/source4/librpc/idl/dcerpc.idl b/source4/librpc/idl/dcerpc.idl
index afe4b3003f..cf195b6aea 100644
--- a/source4/librpc/idl/dcerpc.idl
+++ b/source4/librpc/idl/dcerpc.idl
@@ -36,6 +36,7 @@ interface dcerpc
const uint8 DCERPC_REQUEST_LENGTH = 24;
+ const uint8 DCERPC_MAX_SIGN_SIZE = 32;
typedef struct {
uint32 alloc_hint;
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c
index f1756215b1..3dcaca83ec 100644
--- a/source4/librpc/rpc/dcerpc.c
+++ b/source4/librpc/rpc/dcerpc.c
@@ -426,7 +426,7 @@ NTSTATUS dcerpc_request(struct dcerpc_pipe *p,
/* we can write a full max_recv_frag size, minus the dcerpc
request header size */
- chunk_size = p->srv_max_recv_frag - DCERPC_REQUEST_LENGTH;
+ chunk_size = p->srv_max_recv_frag - (DCERPC_MAX_SIGN_SIZE+DCERPC_REQUEST_LENGTH);
pkt.ptype = DCERPC_PKT_REQUEST;
pkt.call_id = p->call_id++;
diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c
index 16b573cfad..a34c00cd58 100644
--- a/source4/rpc_server/dcerpc_server.c
+++ b/source4/rpc_server/dcerpc_server.c
@@ -467,7 +467,9 @@ static NTSTATUS dcesrv_request(struct dcesrv_call_state *call)
length = stub.length;
if (length + DCERPC_RESPONSE_LENGTH > call->dce->cli_max_recv_frag) {
- length = call->dce->cli_max_recv_frag - DCERPC_RESPONSE_LENGTH;
+ /* the 32 is to cope with signing data */
+ length = call->dce->cli_max_recv_frag -
+ (DCERPC_MAX_SIGN_SIZE+DCERPC_RESPONSE_LENGTH);
}
/* form the dcerpc response packet */