[SCM] Samba Shared Repository - branch v4-0-test updated - release-4-0-0alpha2-792-gb3793c6

Andrew Tridgell tridge at samba.org
Wed Feb 13 04:06:51 GMT 2008


The branch, v4-0-test has been updated
       via  b3793c6562b1a1e8711561f65594ba0676f9282d (commit)
       via  d037dc23ced3df6bce98cbf4810fb5f1247336bd (commit)
       via  11102681bcd70b0abb2df38bcdc7fdec51e71600 (commit)
       via  5913e3e549e71affc66c28cacb6563331fb0c790 (commit)
      from  ec8bd3991f76cf8746cf77c277c3491725711f9d (commit)

http://gitweb.samba.org/?samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit b3793c6562b1a1e8711561f65594ba0676f9282d
Merge: d037dc23ced3df6bce98cbf4810fb5f1247336bd ec8bd3991f76cf8746cf77c277c3491725711f9d
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Feb 13 15:06:05 2008 +1100

    Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-test

commit d037dc23ced3df6bce98cbf4810fb5f1247336bd
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Feb 13 15:05:44 2008 +1100

    updated SMB2 create operation to match WSPP.
    
    Adding some defined for various new create options

commit 11102681bcd70b0abb2df38bcdc7fdec51e71600
Merge: 5913e3e549e71affc66c28cacb6563331fb0c790 38855a9f145b54d05f4a508562fc1a6595e0d895
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Feb 13 10:14:04 2008 +1100

    Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-test

commit 5913e3e549e71affc66c28cacb6563331fb0c790
Author: Andrew Tridgell <tridge at samba.org>
Date:   Wed Feb 13 10:13:28 2008 +1100

    updated SMB2 tcon as per WSPP docs

-----------------------------------------------------------------------

Summary of changes:
 source/libcli/raw/interfaces.h  |   38 ++++++++++++++--------------
 source/libcli/smb2/connect.c    |    2 +-
 source/libcli/smb2/create.c     |   52 +++++++++++++++++++-------------------
 source/libcli/smb2/smb2.h       |   50 +++++++++++++++++++++++++++++++++++++
 source/libcli/smb2/smb2_calls.h |    2 +-
 source/libcli/smb2/tcon.c       |   16 +++++++++---
 source/ntvfs/ipc/vfs_ipc.c      |    4 +-
 source/ntvfs/ntvfs.h            |    8 +++--
 source/smb_server/smb2/fileio.c |   22 ++++++++--------
 source/smb_server/smb2/tcon.c   |   28 ++++++++------------
 source/torture/smb2/connect.c   |   10 +++---
 source/torture/smb2/lock.c      |    8 +++---
 source/torture/smb2/util.c      |   40 +++++++++++++++---------------
 13 files changed, 167 insertions(+), 113 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/libcli/raw/interfaces.h b/source/libcli/raw/interfaces.h
index 4211dad..ce6323f 100644
--- a/source/libcli/raw/interfaces.h
+++ b/source/libcli/raw/interfaces.h
@@ -260,20 +260,19 @@ union smb_tcon {
 
 		struct {
 			/* static body buffer 8 (0x08) bytes */
-			/* uint16_t buffer_code; 0x09 = 0x08 + 1 */
-			uint16_t unknown1; /* 0x0000 */
+			uint16_t reserved;
 			/* uint16_t path_ofs */
 			/* uint16_t path_size */
-	
-			/* dynamic body */
+				/* dynamic body */
 			const char *path; /* as non-terminated UTF-16 on the wire */
 		} in;
 		struct {
 			/* static body buffer 16 (0x10) bytes */
 			/* uint16_t buffer_code;  0x10 */
-			uint16_t unknown1; /* 0x02 */
-			uint32_t unknown2; /* 0x00 */
-			uint32_t unknown3; /* 0x00 */
+			uint8_t share_type;
+			uint8_t reserved;
+			uint32_t flags;
+			uint32_t capabilities;
 			uint32_t access_mask;
 	
 			/* extracted from the SMB2 header */
@@ -1553,16 +1552,16 @@ union smb_open {
 		enum smb_open_level level;
 		struct {
 			/* static body buffer 56 (0x38) bytes */
-			/* uint16_t buffer_code;  0x39 = 0x38 + 1 */
-			uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
-			uint32_t impersonation;
-			uint32_t unknown3[4];
-			uint32_t access_mask;
-
-			uint32_t file_attr;
-			uint32_t share_access;
-			uint32_t open_disposition;
-			uint32_t create_options;
+			uint8_t  security_flags;      /* SMB2_SECURITY_* */
+			uint8_t  oplock_level;        /* SMB2_OPLOCK_LEVEL_* */
+			uint32_t impersonation_level; /* SMB2_IMPERSONATION_* */
+			uint64_t create_flags;
+			uint64_t reserved;
+			uint32_t desired_access;
+			uint32_t file_attributes;
+			uint32_t share_access; /* NTCREATEX_SHARE_ACCESS_* */
+			uint32_t create_disposition; /* NTCREATEX_DISP_* */
+			uint32_t create_options; /* NTCREATEX_OPTIONS_* */
 
 			/* uint16_t fname_ofs */
 			/* uint16_t fname_size */
@@ -1580,7 +1579,8 @@ union smb_open {
 
 			/* static body buffer 88 (0x58) bytes */
 			/* uint16_t buffer_code;  0x59 = 0x58 + 1 */
-			uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
+			uint8_t oplock_level;
+			uint8_t reserved;
 			uint32_t create_action;
 			NTTIME   create_time;
 			NTTIME   access_time;
@@ -1589,7 +1589,7 @@ union smb_open {
 			uint64_t alloc_size;
 			uint64_t size;
 			uint32_t file_attr;
-			uint32_t _pad;
+			uint32_t reserved2;
 			/* struct smb2_handle handle;*/
 			/* uint32_t blob_ofs; */
 			/* uint32_t blob_size; */
diff --git a/source/libcli/smb2/connect.c b/source/libcli/smb2/connect.c
index a2ae828..535df11 100644
--- a/source/libcli/smb2/connect.c
+++ b/source/libcli/smb2/connect.c
@@ -73,7 +73,7 @@ static void continue_session(struct composite_context *creq)
 	state->tree = smb2_tree_init(state->session, state, true);
 	if (composite_nomem(state->tree, c)) return;
 
-	state->tcon.in.unknown1 = 0x09;
+	state->tcon.in.reserved = 0;
 	state->tcon.in.path     = talloc_asprintf(state, "\\\\%s\\%s", 
 						  state->host, state->share);
 	if (composite_nomem(state->tcon.in.path, c)) return;
diff --git a/source/libcli/smb2/create.c b/source/libcli/smb2/create.c
index ba11c22..cca83a0 100644
--- a/source/libcli/smb2/create.c
+++ b/source/libcli/smb2/create.c
@@ -24,34 +24,33 @@
 #include "libcli/smb2/smb2.h"
 #include "libcli/smb2/smb2_calls.h"
 
-#define CREATE_TAG_EXTA 0x41747845 /* "ExtA" */
-#define CREATE_TAG_MXAC 0x6341784D /* "MxAc" */
-
 /*
   add a blob to a smb2_create attribute blob
 */
 NTSTATUS smb2_create_blob_add(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, 
-			      uint32_t tag,
+			      const char *tag,
 			      DATA_BLOB add, bool last)
 {
 	uint32_t ofs = blob->length;
-	uint8_t pad = smb2_padding_size(add.length, 8);
-	if (!data_blob_realloc(mem_ctx, blob, blob->length + 0x18 + add.length + pad))
+	size_t tag_length = strlen(tag);
+	uint8_t pad = smb2_padding_size(add.length+tag_length, 8);
+	if (!data_blob_realloc(mem_ctx, blob, 
+			       blob->length + 0x14 + tag_length + add.length + pad))
 		return NT_STATUS_NO_MEMORY;
 	
 	if (last) {
 		SIVAL(blob->data, ofs+0x00, 0);
 	} else {
-		SIVAL(blob->data, ofs+0x00, 0x18 + add.length + pad);
+		SIVAL(blob->data, ofs+0x00, 0x14 + tag_length + add.length + pad);
 	}
 	SSVAL(blob->data, ofs+0x04, 0x10); /* offset of tag */
-	SIVAL(blob->data, ofs+0x06, 0x04); /* tag length */
-	SSVAL(blob->data, ofs+0x0A, 0x18); /* offset of data */
+	SIVAL(blob->data, ofs+0x06, tag_length); /* tag length */
+	SSVAL(blob->data, ofs+0x0A, 0x14 + tag_length); /* offset of data */
 	SIVAL(blob->data, ofs+0x0C, add.length);
-	SIVAL(blob->data, ofs+0x10, tag);
-	SIVAL(blob->data, ofs+0x14, 0); /* pad? */
-	memcpy(blob->data+ofs+0x18, add.data, add.length);
-	memset(blob->data+ofs+0x18+add.length, 0, pad);
+	memcpy(blob->data+ofs+0x10, tag, tag_length);
+	SIVAL(blob->data, ofs+0x10+tag_length, 0); /* pad? */
+	memcpy(blob->data+ofs+0x14+tag_length, add.data, add.length);
+	memset(blob->data+ofs+0x14+tag_length+add.length, 0, pad);
 
 	return NT_STATUS_OK;
 }
@@ -68,16 +67,15 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create
 	req = smb2_request_init_tree(tree, SMB2_OP_CREATE, 0x38, true, 0);
 	if (req == NULL) return NULL;
 
-	SSVAL(req->out.body, 0x02, io->in.oplock_flags);
-	SIVAL(req->out.body, 0x04, io->in.impersonation);
-	SIVAL(req->out.body, 0x08, io->in.unknown3[0]);
-	SIVAL(req->out.body, 0x0C, io->in.unknown3[1]);
-	SIVAL(req->out.body, 0x10, io->in.unknown3[2]);
-	SIVAL(req->out.body, 0x14, io->in.unknown3[3]);
-	SIVAL(req->out.body, 0x18, io->in.access_mask);
-	SIVAL(req->out.body, 0x1C, io->in.file_attr);
+	SCVAL(req->out.body, 0x02, io->in.security_flags);
+	SCVAL(req->out.body, 0x03, io->in.oplock_level);
+	SIVAL(req->out.body, 0x04, io->in.impersonation_level);
+	SBVAL(req->out.body, 0x08, io->in.create_flags);
+	SBVAL(req->out.body, 0x10, io->in.reserved);
+	SIVAL(req->out.body, 0x18, io->in.desired_access);
+	SIVAL(req->out.body, 0x1C, io->in.file_attributes);
 	SIVAL(req->out.body, 0x20, io->in.share_access);
-	SIVAL(req->out.body, 0x24, io->in.open_disposition);
+	SIVAL(req->out.body, 0x24, io->in.create_disposition);
 	SIVAL(req->out.body, 0x28, io->in.create_options);
 
 	status = smb2_push_o16s16_string(&req->out, 0x2C, io->in.fname);
@@ -90,7 +88,7 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create
 		DATA_BLOB b = data_blob_talloc(req, NULL, 
 					       ea_list_size_chained(io->in.eas.num_eas, io->in.eas.eas));
 		ea_put_list_chained(b.data, io->in.eas.num_eas, io->in.eas.eas);
-		status = smb2_create_blob_add(req, &blob, CREATE_TAG_EXTA, b, false);
+		status = smb2_create_blob_add(req, &blob, SMB2_CREATE_TAG_EXTA, b, false);
 		if (!NT_STATUS_IS_OK(status)) {
 			talloc_free(req);
 			return NULL;
@@ -100,7 +98,8 @@ struct smb2_request *smb2_create_send(struct smb2_tree *tree, struct smb2_create
 
 	/* an empty MxAc tag seems to be used to ask the server to
 	   return the maximum access mask allowed on the file */
-	status = smb2_create_blob_add(req, &blob, CREATE_TAG_MXAC, data_blob(NULL, 0), true);
+	status = smb2_create_blob_add(req, &blob, SMB2_CREATE_TAG_MXAC, 
+				      data_blob(NULL, 0), true);
 
 	if (!NT_STATUS_IS_OK(status)) {
 		talloc_free(req);
@@ -132,7 +131,8 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct
 
 	SMB2_CHECK_PACKET_RECV(req, 0x58, true);
 
-	io->out.oplock_flags   = SVAL(req->in.body, 0x02);
+	io->out.oplock_level   = CVAL(req->in.body, 0x02);
+	io->out.reserved       = CVAL(req->in.body, 0x03);
 	io->out.create_action  = IVAL(req->in.body, 0x04);
 	io->out.create_time    = smbcli_pull_nttime(req->in.body, 0x08);
 	io->out.access_time    = smbcli_pull_nttime(req->in.body, 0x10);
@@ -141,7 +141,7 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct
 	io->out.alloc_size     = BVAL(req->in.body, 0x28);
 	io->out.size           = BVAL(req->in.body, 0x30);
 	io->out.file_attr      = IVAL(req->in.body, 0x38);
-	io->out._pad           = IVAL(req->in.body, 0x3C);
+	io->out.reserved2      = IVAL(req->in.body, 0x3C);
 	smb2_pull_handle(req->in.body+0x40, &io->out.file.handle);
 	status = smb2_pull_o32s32_blob(&req->in, mem_ctx, req->in.body+0x50, &io->out.blob);
 	if (!NT_STATUS_IS_OK(status)) {
diff --git a/source/libcli/smb2/smb2.h b/source/libcli/smb2/smb2.h
index 60cf3e0..db13ab6 100644
--- a/source/libcli/smb2/smb2.h
+++ b/source/libcli/smb2/smb2.h
@@ -195,6 +195,56 @@ struct smb2_request {
 
 #define SMB2_MAGIC 0x424D53FE /* 0xFE 'S' 'M' 'B' */
 
+/* SMB2 negotiate security_mode */
+#define SMB2_NEGOTIATE_SIGNING_ENABLED   0x01
+#define SMB2_NEGOTIATE_SIGNING_REQUIRED  0x02
+
+/* SMB2 capabilities - only 1 so far. I'm sure more will be added */
+#define SMB2_CAP_DFS                     0x0
+/* so we can spot new caps as added */
+#define SMB2_CAP_ALL                     SMB2_CAP_DFS 
+
+/* SMB2 share flags */
+#define SMB2_SHAREFLAG_MANUAL_CACHING                    0x0000
+#define SMB2_SHAREFLAG_AUTO_CACHING                      0x0010
+#define SMB2_SHAREFLAG_VDO_CACHING                       0x0020
+#define SMB2_SHAREFLAG_NO_CACHING                        0x0030
+#define SMB2_SHAREFLAG_DFS                               0x0001
+#define SMB2_SHAREFLAG_DFS_ROOT                          0x0002
+#define SMB2_SHAREFLAG_RESTRICT_EXCLUSIVE_OPENS          0x0100
+#define SMB2_SHAREFLAG_FORCE_SHARED_DELETE               0x0200
+#define SMB2_SHAREFLAG_ALLOW_NAMESPACE_CACHING           0x0400
+#define SMB2_SHAREFLAG_ACCESS_BASED_DIRECTORY_ENUM       0x0800
+#define SMB2_SHAREFLAG_ALL                               0x0F33
+
+/* SMB2 create security flags */
+#define SMB2_SECURITY_DYNAMIC_TRACKING                   0x01
+#define SMB2_SECURITY_EFFECTIVE_ONLY                     0x02
+
+/* SMB2 requested oplock levels */
+#define SMB2_OPLOCK_LEVEL_NONE                           0x00
+#define SMB2_OPLOCK_LEVEL_II                             0x01
+#define SMB2_OPLOCK_LEVEL_EXCLUSIVE                      0x08
+#define SMB2_OPLOCK_LEVEL_BATCH                          0x09
+
+/* SMB2 impersonation levels */
+#define SMB2_IMPERSONATION_ANONYMOUS                     0x00
+#define SMB2_IMPERSONATION_IDENTIFICATION                0x01
+#define SMB2_IMPERSONATION_IMPERSONATION                 0x02
+#define SMB2_IMPERSONATION_DELEGATE                      0x03
+
+/* SMB2 create tags */
+#define SMB2_CREATE_TAG_EXTA "ExtA"
+#define SMB2_CREATE_TAG_MXAC "MxAc"
+#define SMB2_CREATE_TAG_SECD "SecD"
+#define SMB2_CREATE_TAG_DHNQ "DHnQ"
+#define SMB2_CREATE_TAG_DHNC "DHnC"
+#define SMB2_CREATE_TAG_ALSI "AlSi"
+#define SMB2_CREATE_TAG_TWRP "TWrp"
+#define SMB2_CREATE_TAG_QFID "QFid"
+
+
+
 /*
   check that a body has the expected size
 */
diff --git a/source/libcli/smb2/smb2_calls.h b/source/libcli/smb2/smb2_calls.h
index 423d9d1..f2e3019 100644
--- a/source/libcli/smb2/smb2_calls.h
+++ b/source/libcli/smb2/smb2_calls.h
@@ -35,7 +35,7 @@ struct smb2_negprot {
 	struct {
 		/* static body buffer 64 (0x40) bytes */
 		/* uint16_t buffer_code;  0x41 = 0x40 + 1 */
-		uint16_t security_mode;
+		uint16_t security_mode; /* SMB2_NEGOTIATE_SIGNING_* */
 		uint16_t dialect_revision;
 		uint16_t reserved;
 		struct GUID server_guid;
diff --git a/source/libcli/smb2/tcon.c b/source/libcli/smb2/tcon.c
index 5a09970..db35669 100644
--- a/source/libcli/smb2/tcon.c
+++ b/source/libcli/smb2/tcon.c
@@ -58,7 +58,7 @@ struct smb2_request *smb2_tree_connect_send(struct smb2_tree *tree,
 
 	SBVAL(req->out.hdr,  SMB2_HDR_SESSION_ID, tree->session->uid);
 
-	SSVAL(req->out.body, 0x02, io->in.unknown1);
+	SSVAL(req->out.body, 0x02, io->in.reserved);
 	status = smb2_push_o16s16_string(&req->out, 0x04, io->in.path);
 	if (!NT_STATUS_IS_OK(status)) {
 		talloc_free(req);
@@ -85,10 +85,18 @@ NTSTATUS smb2_tree_connect_recv(struct smb2_request *req, struct smb2_tree_conne
 
 	io->out.tid      = IVAL(req->in.hdr,  SMB2_HDR_TID);
 
-	io->out.unknown1    = SVAL(req->in.body, 0x02);
-	io->out.unknown2    = IVAL(req->in.body, 0x04);
-	io->out.unknown3    = IVAL(req->in.body, 0x08);
+	io->out.share_type  = CVAL(req->in.body, 0x02);
+	io->out.reserved    = CVAL(req->in.body, 0x03);
+	io->out.flags       = IVAL(req->in.body, 0x04);
+	io->out.capabilities= IVAL(req->in.body, 0x08);
 	io->out.access_mask = IVAL(req->in.body, 0x0C);
+
+	if (io->out.capabilities & ~SMB2_CAP_ALL) {
+		DEBUG(0,("Unknown capabilities mask 0x%x\n", io->out.capabilities));
+	}
+	if (io->out.flags & ~SMB2_SHAREFLAG_ALL) {
+		DEBUG(0,("Unknown tcon shareflag 0x%x\n", io->out.flags));
+	}
 	
 	return smb2_request_destroy(req);
 }
diff --git a/source/ntvfs/ipc/vfs_ipc.c b/source/ntvfs/ipc/vfs_ipc.c
index 81cd984..92f0ead 100644
--- a/source/ntvfs/ipc/vfs_ipc.c
+++ b/source/ntvfs/ipc/vfs_ipc.c
@@ -322,7 +322,7 @@ static NTSTATUS ipc_open_smb2(struct ntvfs_module_context *ntvfs,
 	NT_STATUS_NOT_OK_RETURN(status);
 
 	oi->smb2.out.file.ntvfs		= p->handle;
-	oi->smb2.out.oplock_flags	= oi->smb2.in.oplock_flags;
+	oi->smb2.out.oplock_level	= oi->smb2.in.oplock_level;
 	oi->smb2.out.create_action	= NTCREATEX_ACTION_EXISTED;
 	oi->smb2.out.create_time	= 0;
 	oi->smb2.out.access_time	= 0;
@@ -331,7 +331,7 @@ static NTSTATUS ipc_open_smb2(struct ntvfs_module_context *ntvfs,
 	oi->smb2.out.alloc_size		= 4096;
 	oi->smb2.out.size		= 0;
 	oi->smb2.out.file_attr		= FILE_ATTRIBUTE_NORMAL;
-	oi->smb2.out._pad		= 0;
+	oi->smb2.out.reserved2		= 0;
 	oi->smb2.out.blob		= data_blob(NULL, 0);
 
 	return status;
diff --git a/source/ntvfs/ntvfs.h b/source/ntvfs/ntvfs.h
index fe5f956..a708dbf 100644
--- a/source/ntvfs/ntvfs.h
+++ b/source/ntvfs/ntvfs.h
@@ -32,9 +32,11 @@ struct ntvfs_module_context;
 struct ntvfs_request;
 
 /* each backend has to be one one of the following 3 basic types. In
- * earlier versions of Samba backends needed to handle all types, now
- * we implement them separately. */
-enum ntvfs_type {NTVFS_DISK, NTVFS_PRINT, NTVFS_IPC};
+   earlier versions of Samba backends needed to handle all types, now
+   we implement them separately.
+   The values 1..3 match the SMB2 SMB2_SHARE_TYPE_* values
+ */
+enum ntvfs_type {NTVFS_DISK=1, NTVFS_IPC=2, NTVFS_PRINT=3};
 
 /* the ntvfs operations structure - contains function pointers to 
    the backend implementations of each operation */
diff --git a/source/smb_server/smb2/fileio.c b/source/smb_server/smb2/fileio.c
index 0e83c78..567243b 100644
--- a/source/smb_server/smb2/fileio.c
+++ b/source/smb_server/smb2/fileio.c
@@ -34,7 +34,8 @@ static void smb2srv_create_send(struct ntvfs_request *ntvfs)
 	SMB2SRV_CHECK_ASYNC_STATUS(io, union smb_open);
 	SMB2SRV_CHECK(smb2srv_setup_reply(req, 0x58, true, io->smb2.out.blob.length));
 
-	SSVAL(req->out.body,	0x02,	io->smb2.out.oplock_flags);
+	SCVAL(req->out.body,	0x02,	io->smb2.out.oplock_level);
+	SCVAL(req->out.body,	0x03,	io->smb2.out.reserved);
 	SIVAL(req->out.body,	0x04,	io->smb2.out.create_action);
 	SBVAL(req->out.body,	0x08,	io->smb2.out.create_time);
 	SBVAL(req->out.body,	0x10,	io->smb2.out.access_time);
@@ -43,7 +44,7 @@ static void smb2srv_create_send(struct ntvfs_request *ntvfs)
 	SBVAL(req->out.body,	0x28,	io->smb2.out.alloc_size);
 	SBVAL(req->out.body,	0x30,	io->smb2.out.size);
 	SIVAL(req->out.body,	0x38,	io->smb2.out.file_attr);
-	SIVAL(req->out.body,	0x3C,	io->smb2.out._pad);
+	SIVAL(req->out.body,	0x3C,	io->smb2.out.reserved2);
 	smb2srv_push_handle(req->out.body, 0x40, io->smb2.out.file.ntvfs);
 	SMB2SRV_CHECK(smb2_push_o32s32_blob(&req->out, 0x50, io->smb2.out.blob));
 
@@ -64,16 +65,15 @@ void smb2srv_create_recv(struct smb2srv_request *req)
 	SMB2SRV_SETUP_NTVFS_REQUEST(smb2srv_create_send, NTVFS_ASYNC_STATE_MAY_ASYNC);
 
 	io->smb2.level			= RAW_OPEN_SMB2;
-	io->smb2.in.oplock_flags	= SVAL(req->in.body, 0x02);
-	io->smb2.in.impersonation	= IVAL(req->in.body, 0x04);
-	io->smb2.in.unknown3[0]		= IVAL(req->in.body, 0x08);
-	io->smb2.in.unknown3[1]		= IVAL(req->in.body, 0x0C);
-	io->smb2.in.unknown3[2]		= IVAL(req->in.body, 0x10);
-	io->smb2.in.unknown3[3]		= IVAL(req->in.body, 0x14);
-	io->smb2.in.access_mask		= IVAL(req->in.body, 0x18);
-	io->smb2.in.file_attr		= IVAL(req->in.body, 0x1C);
+	io->smb2.in.security_flags	= CVAL(req->in.body, 0x02);
+	io->smb2.in.oplock_level	= CVAL(req->in.body, 0x03);
+	io->smb2.in.impersonation_level	= IVAL(req->in.body, 0x04);
+	io->smb2.in.create_flags	= BVAL(req->in.body, 0x08);
+	io->smb2.in.reserved		= BVAL(req->in.body, 0x10);
+	io->smb2.in.desired_access	= IVAL(req->in.body, 0x18);
+	io->smb2.in.file_attributes	= IVAL(req->in.body, 0x1C);
 	io->smb2.in.share_access	= IVAL(req->in.body, 0x20);
-	io->smb2.in.open_disposition	= IVAL(req->in.body, 0x24);
+	io->smb2.in.create_disposition	= IVAL(req->in.body, 0x24);
 	io->smb2.in.create_options	= IVAL(req->in.body, 0x28);
 	SMB2SRV_CHECK(smb2_pull_o16s16_string(&req->in, io, req->in.body+0x2C, &io->smb2.in.fname));
 	SMB2SRV_CHECK(smb2_pull_o32s32_blob(&req->in, io, req->in.body+0x30, &blob));
diff --git a/source/smb_server/smb2/tcon.c b/source/smb_server/smb2/tcon.c
index 824a57b..b375ce6 100644
--- a/source/smb_server/smb2/tcon.c
+++ b/source/smb_server/smb2/tcon.c
@@ -240,8 +240,6 @@ static NTSTATUS smb2srv_tcon_backend(struct smb2srv_request *req, union smb_tcon
 	struct smbsrv_tcon *tcon;
 	NTSTATUS status;
 	enum ntvfs_type type;
-	uint16_t type_smb2;
-	uint32_t unknown2;
 	const char *service = io->smb2.in.path;
 	struct share_config *scfg;
 	const char *sharetype;
@@ -270,16 +268,10 @@ static NTSTATUS smb2srv_tcon_backend(struct smb2srv_request *req, union smb_tcon
 	sharetype = share_string_option(scfg, SHARE_TYPE, "DISK");
 	if (sharetype && strcmp(sharetype, "IPC") == 0) {
 		type = NTVFS_IPC;
-		type_smb2 = 0x0002;
-		unknown2 = 0x00000030;
 	} else if (sharetype && strcmp(sharetype, "PRINTER") == 0) {
 		type = NTVFS_PRINT;
-		type_smb2 = 0x0003;
-		unknown2 = 0x00000000;
 	} else {
 		type = NTVFS_DISK;
-		type_smb2 = 0x0001;
-		unknown2 = 0x00000800;
 	}
 
 	tcon = smbsrv_smb2_tcon_new(req->session, scfg->name);
@@ -344,10 +336,11 @@ static NTSTATUS smb2srv_tcon_backend(struct smb2srv_request *req, union smb_tcon
 		goto failed;
 	}
 
-	io->smb2.out.unknown1	= type_smb2; /* 1 - DISK, 2 - Print, 3 - IPC */
-	io->smb2.out.unknown2	= unknown2;
-	io->smb2.out.unknown3	= 0x00000000;
-	io->smb2.out.access_mask= SEC_RIGHTS_FILE_ALL;
+	io->smb2.out.share_type	  = (unsigned)type; /* 1 - DISK, 2 - Print, 3 - IPC */
+	io->smb2.out.reserved	  = 0;
+	io->smb2.out.flags	  = 0x00000000;
+	io->smb2.out.capabilities = 0;
+	io->smb2.out.access_mask  = SEC_RIGHTS_FILE_ALL;
 
 	io->smb2.out.tid	= tcon->tid;
 
@@ -367,7 +360,7 @@ static void smb2srv_tcon_send(struct smb2srv_request *req, union smb_tcon *io)
 		smb2srv_send_error(req, req->status);
 		return;
 	}
-	if (io->smb2.out.unknown1 == 0x0002) {
+	if (io->smb2.out.share_type == NTVFS_IPC) {
 		/* if it's an IPC share vista returns 0x0005 */
 		credit = 0x0005;
 	} else {
@@ -379,9 +372,10 @@ static void smb2srv_tcon_send(struct smb2srv_request *req, union smb_tcon *io)
 	SIVAL(req->out.hdr,	SMB2_HDR_TID,	io->smb2.out.tid);
 	SSVAL(req->out.hdr,	SMB2_HDR_CREDIT,credit);
 
-	SSVAL(req->out.body,	0x02,		io->smb2.out.unknown1);
-	SIVAL(req->out.body,	0x04,		io->smb2.out.unknown2);
-	SIVAL(req->out.body,	0x08,		io->smb2.out.unknown3);
+	SCVAL(req->out.body,	0x02,		io->smb2.out.share_type);
+	SCVAL(req->out.body,	0x03,		io->smb2.out.reserved);
+	SIVAL(req->out.body,	0x04,		io->smb2.out.flags);
+	SIVAL(req->out.body,	0x08,		io->smb2.out.capabilities);
 	SIVAL(req->out.body,	0x0C,		io->smb2.out.access_mask);
 
 	smb2srv_send_reply(req);
@@ -395,7 +389,7 @@ void smb2srv_tcon_recv(struct smb2srv_request *req)
 	SMB2SRV_TALLOC_IO_PTR(io, union smb_tcon);
 
 	io->smb2.level		= RAW_TCON_SMB2;
-	io->smb2.in.unknown1	= SVAL(req->in.body, 0x02);
+	io->smb2.in.reserved	= SVAL(req->in.body, 0x02);
 	SMB2SRV_CHECK(smb2_pull_o16s16_string(&req->in, io, req->in.body+0x04, &io->smb2.in.path));
 
 	req->status = smb2srv_tcon_backend(req, io);
diff --git a/source/torture/smb2/connect.c b/source/torture/smb2/connect.c
index f1bc63d..0004ea9 100644
--- a/source/torture/smb2/connect.c
+++ b/source/torture/smb2/connect.c
@@ -147,10 +147,10 @@ static struct smb2_handle torture_smb2_create(struct smb2_tree *tree,
 	TALLOC_CTX *tmp_ctx = talloc_new(tree);
 
 	ZERO_STRUCT(io);
-	io.in.oplock_flags = 0;
-	io.in.access_mask = SEC_RIGHTS_FILE_ALL;
-	io.in.file_attr   = FILE_ATTRIBUTE_NORMAL;
-	io.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+	io.in.oplock_level = 0;
+	io.in.desired_access = SEC_RIGHTS_FILE_ALL;
+	io.in.file_attributes   = FILE_ATTRIBUTE_NORMAL;
+	io.in.create_disposition = NTCREATEX_DISP_OPEN_IF;
 	io.in.share_access = 
 		NTCREATEX_SHARE_ACCESS_DELETE|
 		NTCREATEX_SHARE_ACCESS_READ|
@@ -166,7 +166,7 @@ static struct smb2_handle torture_smb2_create(struct smb2_tree *tree,


-- 
Samba Shared Repository


More information about the samba-cvs mailing list