[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Fri Dec 2 16:15:03 MST 2011


The branch, master has been updated
       via  ecd0e86 Update the waf build system to link with the new PIDL locking code.
       via  1c46fb5 s3: Use autogenerated open_files.idl
       via  057e442 s3: Move ndr_file_id to LIBNDR_OBJ
       via  0c32546 s3: Add open_files.idl
       via  27d95cc librpc: Add support for struct timeval
       via  de1cd12 librpc: Add support for struct timespec
      from  46551d7 Fix bug #8644 - vfs_acl_xattr and vfs_acl_tdb modules can fail to add inheritable entries on a directory with no stored ACL.

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


- Log -----------------------------------------------------------------
commit ecd0e86928b6cbd17792d57e2fc755ab9cb61bcc
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Dec 2 13:41:55 2011 -0800

    Update the waf build system to link with the new PIDL locking code.
    
    Autobuild-User: Jeremy Allison <jra at samba.org>
    Autobuild-Date: Sat Dec  3 00:14:54 CET 2011 on sn-devel-104

commit 1c46fb5c3e8a1b5ce0d61f39d934bb68074953cb
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 24 14:11:28 2011 +0100

    s3: Use autogenerated open_files.idl

commit 057e4422a7c0b54f32b698f0ef9c3507084501d9
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 24 10:02:44 2011 +0100

    s3: Move ndr_file_id to LIBNDR_OBJ

commit 0c325463a28e4415bb019bb1c11b23a580c53704
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 24 10:01:57 2011 +0100

    s3: Add open_files.idl

commit 27d95cc8a637a226a20eaac9da7c0dc4d8239f88
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 24 09:49:19 2011 +0100

    librpc: Add support for struct timeval

commit de1cd125ade49ab62c0585740e6af66c384d419b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Nov 24 09:48:40 2011 +0100

    librpc: Add support for struct timespec

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

Summary of changes:
 librpc/ndr/libndr.h                       |   20 ++
 librpc/ndr/ndr_basic.c                    |   62 +++++
 source3/Makefile.in                       |    7 +-
 source3/include/smb.h                     |   69 -----
 source3/librpc/idl/open_files.idl         |   48 ++++
 source3/librpc/idl/wscript_build          |    2 +-
 source3/librpc/wscript_build              |    5 +
 source3/libsmb/smb_share_modes.c          |   30 ++
 source3/locking/locking.c                 |  414 +++++------------------------
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c |    1 +
 source3/smbd/close.c                      |    1 +
 source3/smbd/open.c                       |    1 +
 source3/smbd/oplock.c                     |    1 +
 source3/smbd/reply.c                      |    1 +
 source3/smbd/trans2.c                     |    1 +
 source3/utils/status.c                    |    1 +
 source3/web/statuspage.c                  |    1 +
 source3/wscript_build                     |    3 +-
 18 files changed, 246 insertions(+), 422 deletions(-)
 create mode 100644 source3/librpc/idl/open_files.idl


Changeset truncated at 500 lines:

diff --git a/librpc/ndr/libndr.h b/librpc/ndr/libndr.h
index 80b0ec9..9c26bef 100644
--- a/librpc/ndr/libndr.h
+++ b/librpc/ndr/libndr.h
@@ -627,4 +627,24 @@ _PUBLIC_ enum ndr_err_code ndr_push_enum_uint1632(struct ndr_push *ndr, int ndr_
 
 _PUBLIC_ void ndr_print_bool(struct ndr_print *ndr, const char *name, const bool b);
 
+_PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
+					     int ndr_flags,
+					     const struct timespec *t);
+_PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
+					     int ndr_flags,
+					     struct timespec *t);
+_PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
+				 const struct timespec *t);
+
+_PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
+					    int ndr_flags,
+					    const struct timeval *t);
+_PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
+					    int ndr_flags,
+					    struct timeval *t);
+_PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
+				const struct timeval *t);
+
+
+
 #endif /* __LIBNDR_H__ */
diff --git a/librpc/ndr/ndr_basic.c b/librpc/ndr/ndr_basic.c
index ab234bf..7b16438 100644
--- a/librpc/ndr/ndr_basic.c
+++ b/librpc/ndr/ndr_basic.c
@@ -1338,3 +1338,65 @@ _PUBLIC_ NTSTATUS ndr_map_error2ntstatus(enum ndr_err_code ndr_err)
 	/* we should map all error codes to different status codes */
 	return NT_STATUS_INVALID_PARAMETER;
 }
+
+_PUBLIC_ enum ndr_err_code ndr_push_timespec(struct ndr_push *ndr,
+					     int ndr_flags,
+					     const struct timespec *t)
+{
+	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+	NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
+	NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_nsec));
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_timespec(struct ndr_pull *ndr,
+					     int ndr_flags,
+					     struct timespec *t)
+{
+	uint64_t secs;
+	uint32_t nsecs;
+	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+	NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
+	NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &nsecs));
+	t->tv_sec = secs;
+	t->tv_nsec = nsecs;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_timespec(struct ndr_print *ndr, const char *name,
+				 const struct timespec *t)
+{
+	ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
+		   (long)t->tv_nsec);
+}
+
+_PUBLIC_ enum ndr_err_code ndr_push_timeval(struct ndr_push *ndr,
+					    int ndr_flags,
+					    const struct timeval *t)
+{
+	NDR_PUSH_CHECK_FLAGS(ndr, ndr_flags);
+	NDR_CHECK(ndr_push_hyper(ndr, ndr_flags, t->tv_sec));
+	NDR_CHECK(ndr_push_uint32(ndr, ndr_flags, t->tv_usec));
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ enum ndr_err_code ndr_pull_timeval(struct ndr_pull *ndr,
+					    int ndr_flags,
+					    struct timeval *t)
+{
+	uint64_t secs;
+	uint32_t usecs;
+	NDR_PULL_CHECK_FLAGS(ndr, ndr_flags);
+	NDR_CHECK(ndr_pull_hyper(ndr, ndr_flags, &secs));
+	NDR_CHECK(ndr_pull_uint32(ndr, ndr_flags, &usecs));
+	t->tv_sec = secs;
+	t->tv_usec = usecs;
+	return NDR_ERR_SUCCESS;
+}
+
+_PUBLIC_ void ndr_print_timeval(struct ndr_print *ndr, const char *name,
+				const struct timeval *t)
+{
+	ndr->print(ndr, "%-25s: %s.%ld", name, timestring(ndr, t->tv_sec),
+		   (long)t->tv_usec);
+}
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 3531cec..62504fd 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -315,6 +315,7 @@ LIBNDR_OBJ = ../librpc/ndr/ndr_basic.o \
 	     ../librpc/ndr/uuid.o \
 	     ../librpc/ndr/util.o \
 	     librpc/gen_ndr/ndr_server_id.o \
+	     librpc/gen_ndr/ndr_file_id.o \
 	     librpc/gen_ndr/ndr_dcerpc.o
 
 LIBNDR_GEN_OBJ0 = librpc/gen_ndr/ndr_samr.o \
@@ -792,7 +793,8 @@ RPC_SERVER_OBJ = $(RPC_LSARPC_OBJ) $(RPC_WINREG_OBJ) $(RPC_INITSHUTDOWN_OBJ) \
 
 RPC_CLIENT_SCHANNEL_OBJ = rpc_client/cli_pipe_schannel.o
 
-LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o
+LOCKING_OBJ = locking/locking.o locking/brlock.o locking/posix.o \
+		librpc/gen_ndr/ndr_open_files.o
 
 PRIVILEGES_BASIC_OBJ = ../libcli/security/privileges.o
 
@@ -825,7 +827,7 @@ OPLOCK_OBJ = smbd/oplock.o smbd/oplock_irix.o smbd/oplock_linux.o \
 	     smbd/oplock_onefs.o
 
 NOTIFY_OBJ = smbd/notify.o smbd/notify_inotify.o smbd/notify_internal.o \
-	     librpc/gen_ndr/ndr_notify.o librpc/gen_ndr/ndr_file_id.o
+	     librpc/gen_ndr/ndr_notify.o
 
 FNAME_UTIL_OBJ = lib/filename_util.o
 
@@ -1637,6 +1639,7 @@ IDL_FILES = librpc/idl/messaging.idl \
 	    librpc/idl/wbint.idl \
 	    librpc/idl/perfcount.idl \
 	    librpc/idl/secrets.idl \
+	    librpc/idl/open_files.idl \
 	    librpc/idl/libnet_join.idl
 
 samba3-idl::
diff --git a/source3/include/smb.h b/source3/include/smb.h
index b46f498..d3a27e9 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -545,25 +545,6 @@ struct pending_message_list {
 
 #include "librpc/gen_ndr/server_id.h"
 
-/* struct returned by get_share_modes */
-struct share_mode_entry {
-	struct server_id pid;
-	uint64_t op_mid;	/* For compatibility with SMB2 opens. */
-	uint16 op_type;
-	uint32 access_mask;		/* NTCreateX access bits (FILE_READ_DATA etc.) */
-	uint32 share_access;		/* NTCreateX share constants (FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE). */
-	uint32 private_options;	/* NT Create options, but we only look at
-				 * NTCREATEX_OPTIONS_PRIVATE_DENY_DOS and
-				 * NTCREATEX_OPTIONS_PRIVATE_DENY_FCB for
-				 * smbstatus and swat */
-	struct timeval time;
-	struct file_id id;
-	unsigned long share_file_id;
-	uint32 uid;		/* uid of file opener. */
-	uint16 flags;		/* See SHARE_MODE_XX above. */
-	uint32_t name_hash;		/* Jenkins hash of full pathname. */
-};
-
 /* oplock break message definition - linearization of share_mode_entry.
 
 Offset  Data			length.
@@ -605,56 +586,6 @@ Offset  Data			length.
 #define OP_BREAK_MSG_VNN_OFFSET 72
 #define MSG_SMB_SHARE_MODE_ENTRY_SIZE 76
 
-struct delete_token {
-	uint32_t name_hash;
-	struct security_unix_token *delete_token;
-};
-
-struct share_mode_lock {
-	const char *servicepath; /* canonicalized. */
-	const char *base_name;
-	const char *stream_name;
-	struct file_id id;
-	int num_share_modes;
-	struct share_mode_entry *share_modes;
-	int num_delete_tokens;
-	struct delete_token *delete_tokens;
-	struct timespec old_write_time;
-	struct timespec changed_write_time;
-	bool fresh;
-	bool modified;
-	struct db_record *record;
-};
-
-/*
- * Internal structure of locking.tdb share mode db.
- * Used by locking.c and libsmbsharemodes.c
- */
-
-struct locking_data {
-	union {
-		struct {
-			int num_share_mode_entries;
-			struct timespec old_write_time;
-			struct timespec changed_write_time;
-			uint32 num_delete_token_entries;
-		} s;
-		struct share_mode_entry dummy; /* Needed for alignment. */
-	} u;
-	/* The following four entries are implicit
-
-	   (1) struct share_mode_entry modes[num_share_mode_entries];
-
-	   (2) A num_delete_token_entries of structs {
-		uint32_t len_delete_token;
-		char unix_token[len_delete_token] (divisible by 4).
-	   };
-
-	   (3) char share_name[];
-	   (4) char file_name[];
-        */
-};
-
 #define NT_HASH_LEN 16
 #define LM_HASH_LEN 16
 
diff --git a/source3/librpc/idl/open_files.idl b/source3/librpc/idl/open_files.idl
new file mode 100644
index 0000000..c6f1627
--- /dev/null
+++ b/source3/librpc/idl/open_files.idl
@@ -0,0 +1,48 @@
+#include "idl_types.h"
+
+import "server_id.idl";
+import "security.idl";
+import "file_id.idl";
+
+[
+    pointer_default(unique)
+]
+
+interface open_files
+{
+    typedef [public] struct {
+	server_id	pid;
+	hyper		op_mid;
+	uint16		op_type;
+	uint32		access_mask;
+	uint32		share_access;
+	uint32		private_options;
+	timeval		time;
+	file_id		id;
+	udlong		share_file_id;
+	uint32		uid;
+	uint16		flags;
+	uint32		name_hash;
+    } share_mode_entry;
+
+    typedef [public] struct {
+	uint32		name_hash;
+	security_unix_token *delete_token;
+    } delete_token;
+
+    typedef [public] struct {
+	[string,charset(UTF8)] char *servicepath;
+	[string,charset(UTF8)] char *base_name;
+	[string,charset(UTF8)] char *stream_name;
+	file_id id;
+	uint32 num_share_modes;
+	[size_is(num_share_modes)] share_mode_entry share_modes[];
+	uint32 num_delete_tokens;
+	[size_is(num_delete_tokens)] delete_token delete_tokens[];
+	timespec old_write_time;
+	timespec changed_write_time;
+	uint8 fresh;
+	uint8 modified;
+	[ignore] db_record *record;
+    } share_mode_lock;
+}
diff --git a/source3/librpc/idl/wscript_build b/source3/librpc/idl/wscript_build
index 3e07542..949eecd 100644
--- a/source3/librpc/idl/wscript_build
+++ b/source3/librpc/idl/wscript_build
@@ -5,7 +5,7 @@ import os
 topinclude=os.path.join(bld.srcnode.abspath(), 'librpc/idl')
 
 bld.SAMBA_PIDL_LIST('PIDL',
-                    '''messaging.idl libnetapi.idl
+                    '''messaging.idl libnetapi.idl open_files.idl
                        perfcount.idl secrets.idl libnet_join.idl''',
                     options='--includedir=%s --header --ndr-parser' % topinclude,
                     output_dir='../gen_ndr')
diff --git a/source3/librpc/wscript_build b/source3/librpc/wscript_build
index a4af551..8aa0161 100644
--- a/source3/librpc/wscript_build
+++ b/source3/librpc/wscript_build
@@ -15,6 +15,11 @@ bld.SAMBA3_SUBSYSTEM('NDR_MESSAGING',
 	public_deps='ndr NDR_SERVER_ID'
 	)
 
+bld.SAMBA3_SUBSYSTEM('NDR_OPEN_FILES',
+	source='gen_ndr/ndr_open_files.c',
+	public_deps='ndr NDR_SERVER_ID NDR_FILE_ID NDR_SECURITY'
+	)
+
 bld.SAMBA3_SUBSYSTEM('NDR_SECRETS',
 	source='gen_ndr/ndr_secrets.c',
 	public_deps='ndr'
diff --git a/source3/libsmb/smb_share_modes.c b/source3/libsmb/smb_share_modes.c
index 42640e0..f6f8bf9 100644
--- a/source3/libsmb/smb_share_modes.c
+++ b/source3/libsmb/smb_share_modes.c
@@ -29,6 +29,7 @@
 #include "system/filesys.h"
 #include "smb_share_modes.h"
 #include "tdb_compat.h"
+#include "librpc/gen_ndr/open_files.h"
 #include <ccan/hash/hash.h>
 
 /* Database context handle. */
@@ -41,6 +42,35 @@ struct smbdb_ctx {
 #undef malloc
 #endif
 
+/*
+ * Internal structure of locking.tdb share mode db.
+ * Used by locking.c and libsmbsharemodes.c
+ */
+
+struct locking_data {
+	union {
+		struct {
+			int num_share_mode_entries;
+			struct timespec old_write_time;
+			struct timespec changed_write_time;
+			uint32 num_delete_token_entries;
+		} s;
+		struct share_mode_entry dummy; /* Needed for alignment. */
+	} u;
+	/* The following four entries are implicit
+
+	   (1) struct share_mode_entry modes[num_share_mode_entries];
+
+	   (2) A num_delete_token_entries of structs {
+		uint32_t len_delete_token;
+		char unix_token[len_delete_token] (divisible by 4).
+	   };
+
+	   (3) char share_name[];
+	   (4) char file_name[];
+        */
+};
+
 int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx, uint64_t dev,
 				uint64_t ino, uint64_t extid,
 				const struct smb_share_mode_entry *new_entry,
diff --git a/source3/locking/locking.c b/source3/locking/locking.c
index 611b2d2..caa2b5a 100644
--- a/source3/locking/locking.c
+++ b/source3/locking/locking.c
@@ -45,6 +45,7 @@
 #include "serverid.h"
 #include "messages.h"
 #include "util_tdb.h"
+#include "../librpc/gen_ndr/ndr_open_files.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_LOCKING
@@ -510,221 +511,35 @@ char *share_mode_str(TALLOC_CTX *ctx, int num, const struct share_mode_entry *e)
 }
 
 /*******************************************************************
- Print out a share mode table.
-********************************************************************/
-
-static void print_share_mode_table(struct locking_data *data)
-{
-	int num_share_modes = data->u.s.num_share_mode_entries;
-	struct share_mode_entry *shares =
-		(struct share_mode_entry *)(data + 1);
-	int i;
-
-	for (i = 0; i < num_share_modes; i++) {
-		struct share_mode_entry entry;
-		char *str;
-
-		/*
-		 * We need to memcpy the entry here due to alignment
-		 * restrictions that are not met when directly accessing
-		 * shares[i]
-		 */
-
-		memcpy(&entry, &shares[i], sizeof(struct share_mode_entry));
-		str = share_mode_str(talloc_tos(), i, &entry);
-
-		DEBUG(10,("print_share_mode_table: %s\n", str ? str : ""));
-		TALLOC_FREE(str);
-	}
-}
-
-static int parse_delete_tokens_list(struct share_mode_lock *lck,
-		struct locking_data *pdata,
-		const TDB_DATA dbuf)
-{
-	uint8_t *p = dbuf.dptr + sizeof(struct locking_data) +
-			(lck->num_share_modes *
-			sizeof(struct share_mode_entry));
-	uint8_t *end_ptr = dbuf.dptr + (dbuf.dsize - 2);
-	int delete_tokens_size = 0;
-	int i;
-
-	lck->num_delete_tokens = 0;
-	lck->delete_tokens = NULL;
-
-	for (i = 0; i < pdata->u.s.num_delete_token_entries; i++) {
-		uint32_t token_len;
-		struct delete_token *pdt;
-
-		if (end_ptr - p < (sizeof(uint32_t) + sizeof(uint32_t) +
-					sizeof(uid_t) + sizeof(gid_t))) {
-			DEBUG(0,("parse_delete_tokens_list: "
-				"corrupt token list (%u)",
-				(unsigned int)(end_ptr - p)));
-			smb_panic("corrupt token list");
-			return -1;
-		}
-
-		memcpy(&token_len, p, sizeof(token_len));
-		delete_tokens_size += token_len;
-
-		if (p + token_len > end_ptr || token_len < sizeof(token_len) +
-						sizeof(pdt->name_hash) +
-						sizeof(uid_t) +
-						sizeof(gid_t)) {
-			DEBUG(0,("parse_delete_tokens_list: "
-				"invalid token length (%u)\n",
-				(unsigned int)token_len ));
-			smb_panic("invalid token length");
-			return -1;
-		}
-
-		p += sizeof(token_len);
-
-		lck->delete_tokens = talloc_realloc(
-			lck, lck->delete_tokens, struct delete_token,
-			lck->num_delete_tokens+1);
-
-		if (lck->delete_tokens == NULL) {
-			DEBUG(0, ("parse_delete_tokens_list: talloc failed"));
-			return -1;
-		}
-		pdt = &lck->delete_tokens[lck->num_delete_tokens];
-
-		/* Copy out the name_hash. */
-		memcpy(&pdt->name_hash, p, sizeof(pdt->name_hash));
-		p += sizeof(pdt->name_hash);
-
-		pdt->delete_token = talloc_zero(
-			lck->delete_tokens, struct security_unix_token);
-		if (pdt->delete_token == NULL) {
-			DEBUG(0,("parse_delete_tokens_list: talloc failed"));
-			return -1;
-		}
-
-		/* Copy out the uid and gid. */
-		memcpy(&pdt->delete_token->uid, p, sizeof(uid_t));
-		p += sizeof(uid_t);
-		memcpy(&pdt->delete_token->gid, p, sizeof(gid_t));
-		p += sizeof(gid_t);
-
-		token_len -= (sizeof(token_len) + sizeof(pdt->name_hash) +
-				sizeof(uid_t) + sizeof(gid_t));
-
-		/* Any supplementary groups ? */
-		if (token_len) {
-			int j;
-
-			if (token_len % sizeof(gid_t) != 0) {
-				DEBUG(0,("parse_delete_tokens_list: "
-					"corrupt group list (%u)",
-					(unsigned int)(token_len % sizeof(gid_t)) ));
-				smb_panic("corrupt group list");
-				return -1;
-			}
-
-			pdt->delete_token->ngroups = token_len / sizeof(gid_t);
-			pdt->delete_token->groups = talloc_array(
-				pdt->delete_token, gid_t,
-				pdt->delete_token->ngroups);
-			if (pdt->delete_token->groups == NULL) {
-				DEBUG(0,("parse_delete_tokens_list: talloc failed"));
-				return -1;
-			}
-
-			for (j = 0; j < pdt->delete_token->ngroups; j++) {
-				memcpy(&pdt->delete_token->groups[j], p,
-				       sizeof(gid_t));
-				p += sizeof(gid_t);
-			}
-		}


-- 
Samba Shared Repository


More information about the samba-cvs mailing list