summaryrefslogtreecommitdiff
path: root/source4/smb_server/smb2/negprot.c
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-03-06 14:19:11 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:52:17 -0500
commitd8503c6ba120172e9aae737c5510e547e8dea4a5 (patch)
treeae8ee4e9b792fedbb7259bf1ffc132e657bbb8d1 /source4/smb_server/smb2/negprot.c
parent1c49d8f794762d0f3828237961012761212cb37e (diff)
downloadsamba-d8503c6ba120172e9aae737c5510e547e8dea4a5.tar.gz
samba-d8503c6ba120172e9aae737c5510e547e8dea4a5.tar.bz2
samba-d8503c6ba120172e9aae737c5510e547e8dea4a5.zip
r13860: - add support for SMB2 ("SMB 2.001") negotiation in SMB negprot requests
- the default max protocol is still NT1 metze (This used to be commit d1bae931b327dda28e648efc473e0462cf036f7c)
Diffstat (limited to 'source4/smb_server/smb2/negprot.c')
-rw-r--r--source4/smb_server/smb2/negprot.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/source4/smb_server/smb2/negprot.c b/source4/smb_server/smb2/negprot.c
index 71e86ad805..6aab25427f 100644
--- a/source4/smb_server/smb2/negprot.c
+++ b/source4/smb_server/smb2/negprot.c
@@ -173,3 +173,56 @@ void smb2srv_negprot_recv(struct smb2srv_request *req)
}
smb2srv_negprot_send(req, io);
}
+
+/*
+ * reply to a SMB negprot request with dialect "SMB 2.001"
+ */
+void smb2srv_reply_smb_negprot(struct smbsrv_request *smb_req)
+{
+ struct smb2srv_request *req;
+ uint32_t body_fixed_size = 0x26;
+
+ /* create a fake SMB2 negprot request */
+ req = talloc_zero(smb_req->smb_conn, struct smb2srv_request);
+ if (!req) goto nomem;
+ req->smb_conn = smb_req->smb_conn;
+ req->request_time = smb_req->request_time;
+ talloc_steal(req, smb_req);
+
+ req->in.size = NBT_HDR_SIZE+SMB2_HDR_BODY+body_fixed_size;
+ req->in.allocated = req->in.size;
+ req->in.buffer = talloc_size(req, req->in.allocated);
+ if (!req->in.buffer) goto nomem;
+ req->in.hdr = req->in.buffer + NBT_HDR_SIZE;
+ req->in.body = req->in.hdr + SMB2_HDR_BODY;
+ req->in.body_size = body_fixed_size;
+ req->in.dynamic = NULL;
+
+ SIVAL(req->in.hdr, 0, SMB2_MAGIC);
+ SSVAL(req->in.hdr, SMB2_HDR_LENGTH, SMB2_HDR_BODY);
+ SSVAL(req->in.hdr, SMB2_HDR_PAD1, 0);
+ SIVAL(req->in.hdr, SMB2_HDR_STATUS, 0);
+ SSVAL(req->in.hdr, SMB2_HDR_OPCODE, SMB2_OP_NEGPROT);
+ SSVAL(req->in.hdr, SMB2_HDR_PAD2, 0);
+ SIVAL(req->in.hdr, SMB2_HDR_FLAGS, 0);
+ SIVAL(req->in.hdr, SMB2_HDR_UNKNOWN, 0);
+ SBVAL(req->in.hdr, SMB2_HDR_SEQNUM, 0);
+ SIVAL(req->in.hdr, SMB2_HDR_PID, 0);
+ SIVAL(req->in.hdr, SMB2_HDR_TID, 0);
+ SBVAL(req->in.hdr, SMB2_HDR_UID, 0);
+ memset(req->in.hdr+SMB2_HDR_SIG, 0, 16);
+
+ /* this seems to be a bug, they use 0x24 but the length is 0x26 */
+ SSVAL(req->in.body, 0x00, 0x24);
+
+ SSVAL(req->in.body, 0x02, 1);
+ memset(req->in.body+0x04, 0, 32);
+ SSVAL(req->in.body, 0x24, 0);
+
+ smb2srv_negprot_recv(req);
+ return;
+nomem:
+ smbsrv_terminate_connection(smb_req->smb_conn, nt_errstr(NT_STATUS_NO_MEMORY));
+ talloc_free(req);
+ return;
+}