summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregor Beck <gbeck@sernet.de>2014-01-09 13:55:27 +0100
committerGünther Deschner <gd@samba.org>2014-02-11 16:02:14 +0100
commit1eef03aa93056f12d2614cfedee60461db3ac4a3 (patch)
treeff2afa490b405a03dcfb7d509c82392e10af8a66
parent6836ffc9fc088ea6c4444b9e4abfe2766a54f6a8 (diff)
downloadsamba-1eef03aa93056f12d2614cfedee60461db3ac4a3.tar.gz
samba-1eef03aa93056f12d2614cfedee60461db3ac4a3.tar.xz
samba-1eef03aa93056f12d2614cfedee60461db3ac4a3.zip
s3:rpc_server: check header of each packet fragment
Signed-off-by: Gregor Beck <gbeck@sernet.de> Reviewed-by: Stefan Metzmacher <metze@samba.org> Reviewed-by: Guenther Deschner <gd@samba.org>
-rw-r--r--source3/rpc_server/rpc_pipes.h3
-rw-r--r--source3/rpc_server/srv_pipe.c11
2 files changed, 14 insertions, 0 deletions
diff --git a/source3/rpc_server/rpc_pipes.h b/source3/rpc_server/rpc_pipes.h
index 4be57d8f96..1c33a27798 100644
--- a/source3/rpc_server/rpc_pipes.h
+++ b/source3/rpc_server/rpc_pipes.h
@@ -164,6 +164,9 @@ struct pipes_struct {
/* operation number retrieved from the rpc header */
uint16_t opnum;
+ /* rpc header information to check fragments for consistency */
+ struct dcerpc_sec_vt_header2 header2;
+
/* private data for the interface implementation */
void *private_data;
diff --git a/source3/rpc_server/srv_pipe.c b/source3/rpc_server/srv_pipe.c
index 29e5b8af8e..f58eba49f8 100644
--- a/source3/rpc_server/srv_pipe.c
+++ b/source3/rpc_server/srv_pipe.c
@@ -1432,6 +1432,7 @@ static bool process_request_pdu(struct pipes_struct *p, struct ncacn_packet *pkt
{
NTSTATUS status;
DATA_BLOB data;
+ struct dcerpc_sec_vt_header2 hdr2;
if (!p->pipe_bound) {
DEBUG(0,("process_request_pdu: rpc request with no bind.\n"));
@@ -1439,6 +1440,16 @@ static bool process_request_pdu(struct pipes_struct *p, struct ncacn_packet *pkt
return False;
}
+ hdr2 = dcerpc_sec_vt_header2_from_ncacn_packet(pkt);
+ if (pkt->pfc_flags & DCERPC_PFC_FLAG_FIRST) {
+ p->header2 = hdr2;
+ } else {
+ if (!dcerpc_sec_vt_header2_equal(&hdr2, &p->header2)) {
+ set_incoming_fault(p);
+ return false;
+ }
+ }
+
/* Store the opnum */
p->opnum = pkt->u.request.opnum;