[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Tue Aug 7 05:15:03 MDT 2012


The branch, master has been updated
       via  e7bf8e7 s3:smb2_server: do one central as_root check if the operation requires it
       via  eec941e s3:smb2_server: do one central tcon check if the operation requires it
       via  59b9dfa s3:smb2_server: do one central session check if the operation requires it
       via  aba6df9 s3:smb2_server: add and use smbd_smb2_call()
       via  e013332 s3:smb2_server: add .as_root to smbd_smb2_dispatch_table
       via  f69ed57 s3:smb2_server: add .need_tcon to smbd_smb2_dispatch_table
       via  46f7a60 s3:smb2_server: add .need_session to smbd_smb2_dispatch_table
       via  357110c s3:smb2_server: introduce a smbd_smb2_dispatch_table (for now just with names)
       via  5ac4d3d s3:smb2_server: move 'conn' to main block of smbd_smb2_request_dispatch()
       via  83a746d libcli/util: add NT_STATUS_FILE_NOT_AVAILABLE
       via  1453358 libcli/smb: use forward declaration instead of includes
      from  33705f4 s4-scripting: Remove unused variables from ntacl tests

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit e7bf8e7e23855c9f03983200d52a93cdd49c4948
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 12:32:50 2012 +0200

    s3:smb2_server: do one central as_root check if the operation requires it
    
    metze
    
    Autobuild-User(master): Stefan Metzmacher <metze at samba.org>
    Autobuild-Date(master): Tue Aug  7 13:14:38 CEST 2012 on sn-devel-104

commit eec941e411676b72ac40107efcc0e19710db725e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 12:32:50 2012 +0200

    s3:smb2_server: do one central tcon check if the operation requires it
    
    metze

commit 59b9dfa0cbb5e9f165f9fc0bcbd90fedddd7ec32
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 12:32:50 2012 +0200

    s3:smb2_server: do one central session check if the operation requires it
    
    metze

commit aba6df9f5502fcb3fb8b86ae14890554065155f8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 10:42:30 2012 +0200

    s3:smb2_server: add and use smbd_smb2_call()
    
    metze

commit e01333242f149fcbdd9db3b2195c1543c3f0647f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 10:04:48 2012 +0200

    s3:smb2_server: add .as_root to smbd_smb2_dispatch_table
    
    metze

commit f69ed57d0faff446f2c66591cef941dfc1675881
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 10:04:48 2012 +0200

    s3:smb2_server: add .need_tcon to smbd_smb2_dispatch_table
    
    metze

commit 46f7a60e787396af1a061f39ddca699e296b0560
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 10:02:54 2012 +0200

    s3:smb2_server: add .need_session to smbd_smb2_dispatch_table
    
    metze

commit 357110c10be1e4d2e295e3362bbd484463c8af78
Author: Stefan Metzmacher <metze at samba.org>
Date:   Mon Aug 6 09:29:40 2012 +0200

    s3:smb2_server: introduce a smbd_smb2_dispatch_table (for now just with names)
    
    metze

commit 5ac4d3d27448c7ccc7e0ae0b7ee3c83409821d43
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 7 09:48:22 2012 +0200

    s3:smb2_server: move 'conn' to main block of smbd_smb2_request_dispatch()
    
    metze

commit 83a746d7f54f7a99ee6b3e26100f8e2c19e3c3bd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 7 09:22:53 2012 +0200

    libcli/util: add NT_STATUS_FILE_NOT_AVAILABLE
    
    metze

commit 145335878b08712236282bb6155ad3f62c1e54a4
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 7 07:24:22 2012 +0200

    libcli/smb: use forward declaration instead of includes
    
    metze

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

Summary of changes:
 libcli/smb/smbXcli_base.h  |    5 +-
 libcli/util/nterr.c        |    1 +
 libcli/util/ntstatus.h     |    1 +
 source3/smbd/smb2_server.c |  422 +++++++++++++++-----------------------------
 4 files changed, 145 insertions(+), 284 deletions(-)


Changeset truncated at 500 lines:

diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h
index 2c0410b..5ef201e 100644
--- a/libcli/smb/smbXcli_base.h
+++ b/libcli/smb/smbXcli_base.h
@@ -21,14 +21,13 @@
 #ifndef _SMBXCLI_BASE_H_
 #define _SMBXCLI_BASE_H_
 
-#include <sys/uio.h>
-#include "libcli/smb/smb2_create_blob.h"
-
 struct smbXcli_conn;
 struct smbXcli_session;
 struct smbXcli_tcon;
 struct smb_trans_enc_state;
 struct GUID;
+struct iovec;
+struct smb2_create_blobs;
 
 struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
 					 int fd,
diff --git a/libcli/util/nterr.c b/libcli/util/nterr.c
index 4513e5c..793790d 100644
--- a/libcli/util/nterr.c
+++ b/libcli/util/nterr.c
@@ -551,6 +551,7 @@ const nt_err_code_struct nt_errs[] =
 	  NT_STATUS_IO_REPARSE_TAG_NOT_HANDLED },
 	{ "NT_STATUS_NOT_A_REPARSE_POINT", NT_STATUS_NOT_A_REPARSE_POINT },
 	{ "NT_STATUS_NO_MORE_ENTRIES", NT_STATUS_NO_MORE_ENTRIES },
+	{ "NT_STATUS_FILE_NOT_AVAILABLE", NT_STATUS_FILE_NOT_AVAILABLE },
 	{ "NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED", NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED },
 	{ "NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX", NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX },
 	{ "NT_STATUS_RPC_UNKNOWN_IF", NT_STATUS_RPC_UNKNOWN_IF },
diff --git a/libcli/util/ntstatus.h b/libcli/util/ntstatus.h
index af4ab6a..a42f78f 100644
--- a/libcli/util/ntstatus.h
+++ b/libcli/util/ntstatus.h
@@ -608,6 +608,7 @@ typedef uint32_t NTSTATUS;
 #define NT_STATUS_DOWNGRADE_DETECTED NT_STATUS(0xC0000000 | 0x0388)
 #define NT_STATUS_NO_S4U_PROT_SUPPORT NT_STATUS(0xC0000000 | 0x040A)
 #define NT_STATUS_CROSSREALM_DELEGATION_FAILURE NT_STATUS(0xC0000000 | 0x040B)
+#define NT_STATUS_FILE_NOT_AVAILABLE NT_STATUS(0xC00000000 | 0x0467)
 #define NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED NT_STATUS(0xC0000000 | 0x20004)
 #define NT_STATUS_RPC_UNSUPPORTED_NAME_SYNTAX NT_STATUS(0xC0000000 | 0x20026)
 #define NT_STATUS_RPC_UNKNOWN_IF NT_STATUS(0xC0000000 | 0x20012)
diff --git a/source3/smbd/smb2_server.c b/source3/smbd/smb2_server.c
index 1c19cce..4e3259a 100644
--- a/source3/smbd/smb2_server.c
+++ b/source3/smbd/smb2_server.c
@@ -32,34 +32,118 @@
 
 #define OUTVEC_ALLOC_SIZE (SMB2_HDR_BODY + 9)
 
-static const char *smb2_names[] = {
-	"SMB2_NEGPROT",
-	"SMB2_SESSSETUP",
-	"SMB2_LOGOFF",
-	"SMB2_TCON",
-	"SMB2_TDIS",
-	"SMB2_CREATE",
-	"SMB2_CLOSE",
-	"SMB2_FLUSH",
-	"SMB2_READ",
-	"SMB2_WRITE",
-	"SMB2_LOCK",
-	"SMB2_IOCTL",
-	"SMB2_CANCEL",
-	"SMB2_KEEPALIVE",
-	"SMB2_FIND",
-	"SMB2_NOTIFY",
-	"SMB2_GETINFO",
-	"SMB2_SETINFO",
-	"SMB2_BREAK"
+static const struct smbd_smb2_dispatch_table {
+	uint16_t opcode;
+	const char *name;
+	bool need_session;
+	bool need_tcon;
+	bool as_root;
+} smbd_smb2_table[] = {
+#define _OP(o) .opcode = o, .name = #o
+	{
+		_OP(SMB2_OP_NEGPROT),
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_SESSSETUP),
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_LOGOFF),
+		.need_session = true,
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_TCON),
+		.need_session = true,
+		/*
+		 * This call needs to be run as root.
+		 *
+		 * smbd_smb2_request_process_tcon()
+		 * calls make_connection_snum(), which will call
+		 * change_to_user(), when needed.
+		 */
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_TDIS),
+		.need_session = true,
+		.need_tcon = true,
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_CREATE),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_CLOSE),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_FLUSH),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_READ),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_WRITE),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_LOCK),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_IOCTL),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_CANCEL),
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_KEEPALIVE),
+		.as_root = true,
+	},{
+		_OP(SMB2_OP_FIND),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_NOTIFY),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_GETINFO),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_SETINFO),
+		.need_session = true,
+		.need_tcon = true,
+	},{
+		_OP(SMB2_OP_BREAK),
+		.need_session = true,
+		.need_tcon = true,
+	}
 };
 
 const char *smb2_opcode_name(uint16_t opcode)
 {
-	if (opcode > 0x12) {
+	if (opcode >= ARRAY_SIZE(smbd_smb2_table)) {
 		return "Bad SMB2 opcode";
 	}
-	return smb2_names[opcode];
+	return smbd_smb2_table[opcode].name;
+}
+
+static const struct smbd_smb2_dispatch_table *smbd_smb2_call(uint16_t opcode)
+{
+	const struct smbd_smb2_dispatch_table *ret = NULL;
+
+	if (opcode >= ARRAY_SIZE(smbd_smb2_table)) {
+		return NULL;
+	}
+
+	ret = &smbd_smb2_table[opcode];
+
+	SMB_ASSERT(ret->opcode == opcode);
+
+	return ret;
 }
 
 static void print_req_vectors(struct smbd_smb2_request *req)
@@ -1568,6 +1652,8 @@ NTSTATUS smbd_smb2_request_verify_sizes(struct smbd_smb2_request *req,
 
 NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 {
+	struct smbXsrv_connection *conn = req->sconn->conn;
+	const struct smbd_smb2_dispatch_table *call = NULL;
 	const uint8_t *inhdr;
 	uint16_t opcode;
 	uint32_t flags;
@@ -1590,7 +1676,7 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		smb2_opcode_name(opcode),
 		(unsigned long long)mid));
 
-	if (get_Protocol() >= PROTOCOL_SMB2_02) {
+	if (conn->protocol >= PROTOCOL_SMB2_02) {
 		/*
 		 * once the protocol is negotiated
 		 * SMB2_OP_NEGPROT is not allowed anymore
@@ -1610,6 +1696,11 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		}
 	}
 
+	call = smbd_smb2_call(opcode);
+	if (call == NULL) {
+		return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+	}
+
 	allowed_flags = SMB2_HDR_FLAG_CHAINED |
 			SMB2_HDR_FLAG_SIGNED |
 			SMB2_HDR_FLAG_DFS;
@@ -1642,7 +1733,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 
 	req->do_signing = false;
 	if (flags & SMB2_HDR_FLAG_SIGNED) {
-		struct smbXsrv_connection *conn;
 		DATA_BLOB signing_key;
 
 		if (x == NULL) {
@@ -1650,7 +1740,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 				req, NT_STATUS_ACCESS_DENIED);
 		}
 
-		conn = x->connection;
 		signing_key = x->global->channels[0].signing_key;
 
 		if (!NT_STATUS_IS_OK(session_status)) {
@@ -1689,11 +1778,36 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		req->sconn->smb2.compound_related_in_progress = true;
 	}
 
-	switch (opcode) {
-	case SMB2_OP_NEGPROT:
+	if (call->need_session) {
+		if (!NT_STATUS_IS_OK(session_status)) {
+			return smbd_smb2_request_error(req, session_status);
+		}
+	}
+
+	if (call->need_tcon) {
+		SMB_ASSERT(call->need_session);
+
+		/*
+		 * This call needs to be run as user.
+		 *
+		 * smbd_smb2_request_check_tcon()
+		 * calls change_to_user() on success.
+		 */
+		status = smbd_smb2_request_check_tcon(req);
+		if (!NT_STATUS_IS_OK(status)) {
+			return smbd_smb2_request_error(req, status);
+		}
+	}
+
+	if (call->as_root) {
 		/* This call needs to be run as root */
 		change_to_root_user();
+	} else {
+		SMB_ASSERT(call->need_tcon);
+	}
 
+	switch (opcode) {
+	case SMB2_OP_NEGPROT:
 		{
 			START_PROFILE(smb2_negprot);
 			return_value = smbd_smb2_request_process_negprot(req);
@@ -1702,9 +1816,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_SESSSETUP:
-		/* This call needs to be run as root */
-		change_to_root_user();
-
 		{
 			START_PROFILE(smb2_sesssetup);
 			return_value = smbd_smb2_request_process_sesssetup(req);
@@ -1713,14 +1824,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_LOGOFF:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-
-		/* This call needs to be run as root */
-		change_to_root_user();
-
 		{
 			START_PROFILE(smb2_logoff);
 			return_value = smbd_smb2_request_process_logoff(req);
@@ -1729,20 +1832,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_TCON:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-
-		/*
-		 * This call needs to be run as root.
-		 *
-		 * smbd_smb2_request_process_tcon()
-		 * calls make_connection_snum(), which will call
-		 * change_to_user(), when needed.
-		 */
-		change_to_root_user();
-
 		{
 			START_PROFILE(smb2_tcon);
 			return_value = smbd_smb2_request_process_tcon(req);
@@ -1751,25 +1840,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_TDIS:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-		/* This call needs to be run as root */
-		change_to_root_user();
-
-
 		{
 			START_PROFILE(smb2_tdis);
 			return_value = smbd_smb2_request_process_tdis(req);
@@ -1778,22 +1848,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_CREATE:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_create);
 			return_value = smbd_smb2_request_process_create(req);
@@ -1802,22 +1856,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_CLOSE:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_close);
 			return_value = smbd_smb2_request_process_close(req);
@@ -1826,22 +1864,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_FLUSH:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_flush);
 			return_value = smbd_smb2_request_process_flush(req);
@@ -1850,22 +1872,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_READ:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_read);
 			return_value = smbd_smb2_request_process_read(req);
@@ -1874,22 +1880,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_WRITE:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_write);
 			return_value = smbd_smb2_request_process_write(req);
@@ -1898,30 +1888,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_LOCK:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			/* Too ugly to live ? JRA. */
-			if (NT_STATUS_EQUAL(session_status,NT_STATUS_USER_SESSION_DELETED)) {
-				session_status = NT_STATUS_FILE_CLOSED;
-			}
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;
-		}
-		/*
-		 * This call needs to be run as user.
-		 *
-		 * smbd_smb2_request_check_tcon()
-		 * calls change_to_user() on success.
-		 */
-		status = smbd_smb2_request_check_tcon(req);
-		if (!NT_STATUS_IS_OK(status)) {
-			/* Too ugly to live ? JRA. */
-			if (NT_STATUS_EQUAL(status,NT_STATUS_NETWORK_NAME_DELETED)) {
-				status = NT_STATUS_FILE_CLOSED;
-			}
-			return_value = smbd_smb2_request_error(req, status);
-			break;
-		}
-
 		{
 			START_PROFILE(smb2_lock);
 			return_value = smbd_smb2_request_process_lock(req);
@@ -1930,22 +1896,6 @@ NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
 		break;
 
 	case SMB2_OP_IOCTL:
-		if (!NT_STATUS_IS_OK(session_status)) {
-			return_value = smbd_smb2_request_error(req, session_status);
-			break;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list