r16734: the 2 bytes after the opcode and before the flags,
authorStefan Metzmacher <metze@samba.org>
Sat, 1 Jul 2006 14:14:11 +0000 (14:14 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 19:09:42 +0000 (14:09 -0500)
is no padding...

the following patch is needed for vista beta2 to connect to samba4

metze
(This used to be commit 58baae8fc463cd2c4e4ce532c153ad80313b03eb)

source4/libcli/smb2/request.c
source4/libcli/smb2/smb2.h
source4/smb_server/smb2/negprot.c
source4/smb_server/smb2/receive.c
source4/smb_server/smb2/sesssetup.c

index 60fd6ca3ae986e5dc9f40cc9d5985255f8cba24e..016c885675207ecaafdd379da32778f7861af751 100644 (file)
@@ -78,9 +78,9 @@ struct smb2_request *smb2_request_init(struct smb2_transport *transport, uint16_
        SSVAL(req->out.hdr, SMB2_HDR_PAD1,    0);
        SIVAL(req->out.hdr, SMB2_HDR_STATUS,  0);
        SSVAL(req->out.hdr, SMB2_HDR_OPCODE,  opcode);
-       SSVAL(req->out.hdr, SMB2_HDR_PAD2,    0);
+       SSVAL(req->out.hdr, SMB2_HDR_UNKNOWN1,0);
        SIVAL(req->out.hdr, SMB2_HDR_FLAGS,   0);
-       SIVAL(req->out.hdr, SMB2_HDR_UNKNOWN0);
+       SIVAL(req->out.hdr, SMB2_HDR_UNKNOWN2,0);
        SBVAL(req->out.hdr, SMB2_HDR_SEQNUM,  req->seqnum);
        SIVAL(req->out.hdr, SMB2_HDR_PID,     0);
        SIVAL(req->out.hdr, SMB2_HDR_TID,     0);
index 14e6e8d835601ba467fc277825858ae372ac59a9..2c1892cafc2cc3c5ba0dad1515cd8be322a58d51 100644 (file)
@@ -143,19 +143,19 @@ struct smb2_request {
 #define SMB2_MIN_SIZE 0x42
 
 /* offsets into header elements */
-#define SMB2_HDR_LENGTH  0x04
-#define SMB2_HDR_PAD1    0x06
-#define SMB2_HDR_STATUS  0x08
-#define SMB2_HDR_OPCODE  0x0c
-#define SMB2_HDR_PAD2    0x0e
-#define SMB2_HDR_FLAGS   0x10
-#define SMB2_HDR_UNKNOWN 0x14
-#define SMB2_HDR_SEQNUM  0x18
-#define SMB2_HDR_PID     0x20
-#define SMB2_HDR_TID     0x24
-#define SMB2_HDR_UID     0x28 /* 64 bit */
-#define SMB2_HDR_SIG     0x30 /* guess ... */
-#define SMB2_HDR_BODY    0x40
+#define SMB2_HDR_LENGTH                0x04
+#define SMB2_HDR_PAD1          0x06
+#define SMB2_HDR_STATUS                0x08
+#define SMB2_HDR_OPCODE                0x0c
+#define SMB2_HDR_UNKNOWN1      0x0e
+#define SMB2_HDR_FLAGS         0x10
+#define SMB2_HDR_UNKNOWN2      0x14
+#define SMB2_HDR_SEQNUM                0x18
+#define SMB2_HDR_PID           0x20
+#define SMB2_HDR_TID           0x24
+#define SMB2_HDR_UID           0x28 /* 64 bit */
+#define SMB2_HDR_SIG           0x30 /* guess ... */
+#define SMB2_HDR_BODY          0x40
 
 /* SMB2 opcodes */
 #define SMB2_OP_NEGPROT   0x00
index 6d180eb1d6fd8caedeeaeb8ca88241c6cb698fba..66ba9027464ae5af92960c68c54d6efe11ccb85c 100644 (file)
@@ -204,9 +204,9 @@ void smb2srv_reply_smb_negprot(struct smbsrv_request *smb_req)
        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);
+       SSVAL(req->in.hdr, SMB2_HDR_UNKNOWN1,0);
        SIVAL(req->in.hdr, SMB2_HDR_FLAGS,   0);
-       SIVAL(req->in.hdr, SMB2_HDR_UNKNOWN0);
+       SIVAL(req->in.hdr, SMB2_HDR_UNKNOWN2,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);
index 8ac90b89f904df50be05465beeb86c92514eadc5..80b626a78addbe4a39fba25653344330d7c70c29 100644 (file)
@@ -69,9 +69,9 @@ NTSTATUS smb2srv_setup_reply(struct smb2srv_request *req, uint16_t body_fixed_si
        SSVAL(req->out.hdr, SMB2_HDR_PAD1,    0);
        SIVAL(req->out.hdr, SMB2_HDR_STATUS,  NT_STATUS_V(req->status));
        SSVAL(req->out.hdr, SMB2_HDR_OPCODE,  SVAL(req->in.hdr, SMB2_HDR_OPCODE));
-       SSVAL(req->out.hdr, SMB2_HDR_PAD2,    0);
+       SSVAL(req->out.hdr, SMB2_HDR_UNKNOWN1,0x0001);
        SIVAL(req->out.hdr, SMB2_HDR_FLAGS,   0x00000001);
-       SIVAL(req->out.hdr, SMB2_HDR_UNKNOWN0);
+       SIVAL(req->out.hdr, SMB2_HDR_UNKNOWN2,0);
        SBVAL(req->out.hdr, SMB2_HDR_SEQNUM,  req->seqnum);
        SIVAL(req->out.hdr, SMB2_HDR_PID,     IVAL(req->in.hdr, SMB2_HDR_PID));
        SIVAL(req->out.hdr, SMB2_HDR_TID,     IVAL(req->in.hdr, SMB2_HDR_TID));
index 6d472c26d48a63d492f6485ed497eb7c8f523fe4..e1c326bb9d8abf42731e52265910ae826b9c1dc4 100644 (file)
@@ -119,16 +119,21 @@ failed:
 
 static void smb2srv_sesssetup_send(struct smb2srv_request *req, union smb_sesssetup *io)
 {
-       NTSTATUS status;
+       uint16_t unknown1;
 
-       if (NT_STATUS_IS_ERR(req->status) && !NT_STATUS_EQUAL(req->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+       if (NT_STATUS_IS_OK(req->status)) {
+               unknown1 = 0x0003;
+       } else if (NT_STATUS_EQUAL(req->status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               unknown1 = 0x0002;
+       } else {
                smb2srv_send_error(req, req->status);
                return;
        }
 
        SMB2SRV_CHECK(smb2srv_setup_reply(req, 0x08, True, io->smb2.out.secblob.length));
 
-       SBVAL(req->out.hdr, SMB2_HDR_UID,    io->smb2.out.uid);
+       SSVAL(req->out.hdr, SMB2_HDR_UNKNOWN1,  unknown1);
+       SBVAL(req->out.hdr, SMB2_HDR_UID,       io->smb2.out.uid);
 
        SSVAL(req->out.body, 0x02, io->smb2.out._pad);
        SMB2SRV_CHECK(smb2_push_o16s16_blob(&req->out, 0x04, io->smb2.out.secblob));
@@ -139,8 +144,6 @@ static void smb2srv_sesssetup_send(struct smb2srv_request *req, union smb_sessse
 void smb2srv_sesssetup_recv(struct smb2srv_request *req)
 {
        union smb_sesssetup *io;
-       NTSTATUS status;
-
 
        SMB2SRV_CHECK_BODY_SIZE(req, 0x18, True);
        SMB2SRV_TALLOC_IO_PTR(io, union smb_sesssetup);
@@ -170,8 +173,6 @@ static NTSTATUS smb2srv_logoff_backend(struct smb2srv_request *req)
 
 static void smb2srv_logoff_send(struct smb2srv_request *req)
 {
-       NTSTATUS status;
-
        if (NT_STATUS_IS_ERR(req->status)) {
                smb2srv_send_error(req, req->status);
                return;