[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Mon Apr 30 03:30:02 MDT 2012


The branch, master has been updated
       via  dabb056 s3-auth_samba4: use new_server_id_task() to allocate server id values
       via  442a81e s3-lib Add a way to allocate the task_id value in server_id
       via  f10c638 s4-messaging: Fill in the whole server_id in all use cases
      from  645e4bb s4-torture: convert samba3misc tests to use torture_failure and torture_assert

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


- Log -----------------------------------------------------------------
commit dabb0562500bb83ded8243705065c4ef6ebb5049
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Wed Apr 25 17:40:35 2012 +1000

    s3-auth_samba4: use new_server_id_task() to allocate server id values
    
    This is rather than just picking a random number out of the air.
    
    Andrew Bartlett
    
    Autobuild-User: Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date: Mon Apr 30 11:29:34 CEST 2012 on sn-devel-104

commit 442a81e7b282eef85d3c7d978846a531b55cbd5f
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Thu Jul 21 16:29:38 2011 +1000

    s3-lib Add a way to allocate the task_id value in server_id
    
    This safely allocates the task_id so that when we have multiple event
    contexts, they can each have their own messaging context, particularly
    for the imessaging subsystem under source4.
    
    Andrew Bartlett

commit f10c63810077a6759a9df4e9c653066f9f355d96
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Apr 30 15:44:01 2012 +1000

    s4-messaging: Fill in the whole server_id in all use cases
    
    This started per https://bugzilla.samba.org/show_bug.cgi?id=8872#c4
    and avoids any possible collision with a different process.
    
    We also need to ensure that across a Samba installation on a single
    node that id.vnn is the same.  Samba4 previously used 0, while Samba3
    used NONCLUSTER_VNN.  When a message is sent between these 'different'
    nodes, the error NT_STATUS_INVALID_DEVICE_REQUEST is raised.
    
    Andrew Bartlett

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

Summary of changes:
 librpc/idl/server_id.idl          |    3 ++
 source3/Makefile.in               |    3 +-
 source3/auth/auth_samba4.c        |   33 +++++++++++++++++++++++-----
 source3/include/proto.h           |    1 +
 source3/include/serverid.h        |    3 --
 source3/lib/util.c                |   42 +++++++++++++++++++++++++++++++++++++
 source4/cluster/local.c           |    3 ++
 source4/lib/messaging/messaging.c |    7 +++++-
 8 files changed, 83 insertions(+), 12 deletions(-)


Changeset truncated at 500 lines:

diff --git a/librpc/idl/server_id.idl b/librpc/idl/server_id.idl
index ac2e9ab..554e428 100644
--- a/librpc/idl/server_id.idl
+++ b/librpc/idl/server_id.idl
@@ -11,6 +11,9 @@ interface server_id
 
 	const int NONCLUSTER_VNN = 0xFFFFFFFF;
 
+	/** Don't verify this unique id */
+	const int SERVERID_UNIQUE_ID_NOT_TO_VERIFY = 0xFFFFFFFFFFFFFFFFULL;
+
 	/* used to look like the following, note that unique_id was not
 	 * marshalled at all...
 
diff --git a/source3/Makefile.in b/source3/Makefile.in
index e5aba23..37419de 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -484,7 +484,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) $(LIBTSOCKET_OBJ) \
 	  lib/file_id.o lib/idmap_cache.o \
 	  ../libcli/security/dom_sid.o ../libcli/security/security_descriptor.o \
 	  ../libcli/security/security_token.o ../libcli/security/util_sid.o \
-	  ../libcli/smb/util.o
+	  ../libcli/smb/util.o ../lib/util/idtree.o
 
 LIB_DUMMY_OBJ = lib/smbd_shim.o lib/dummyparam.o
 LIB_NONSMBD_OBJ = $(LIB_OBJ) $(LIB_DUMMY_OBJ)
@@ -593,7 +593,6 @@ LIBTSOCKET_OBJ = ../lib/tsocket/tsocket.o \
 
 CLDAP_OBJ = libads/cldap.o \
 	../libcli/cldap/cldap.o \
-	../lib/util/idtree.o \
 	$(LIBCLI_LDAP_MESSAGE_OBJ) $(LIBCLI_LDAP_NDR_OBJ)
 
 TLDAP_OBJ = lib/tldap.o lib/tldap_util.o lib/util_tsock.o
diff --git a/source3/auth/auth_samba4.c b/source3/auth/auth_samba4.c
index 6692f18..1bf4227 100644
--- a/source3/auth/auth_samba4.c
+++ b/source3/auth/auth_samba4.c
@@ -107,6 +107,7 @@ static NTSTATUS prepare_gensec(TALLOC_CTX *mem_ctx,
 	struct gensec_security *gensec_ctx;
 	struct imessaging_context *msg_ctx;
 	struct cli_credentials *server_credentials;
+	struct server_id *server_id;
 
 	lp_ctx = loadparm_init_s3(frame, loadparm_s3_context());
 	if (lp_ctx == NULL) {
@@ -121,15 +122,25 @@ static NTSTATUS prepare_gensec(TALLOC_CTX *mem_ctx,
 		return NT_STATUS_INVALID_SERVER_STATE;
 	}
 
-	msg_ctx = imessaging_client_init(frame,
-					 lp_ctx,
-					 event_ctx);
+	server_id = new_server_id_task(frame);
+	if (server_id == NULL) {
+		DEBUG(1, ("new_server_id_task failed\n"));
+		TALLOC_FREE(frame);
+		return NT_STATUS_INVALID_SERVER_STATE;
+	}
+
+	msg_ctx = imessaging_init(frame,
+				  lp_ctx,
+				  *server_id,
+				  event_ctx, true);
 	if (msg_ctx == NULL) {
 		DEBUG(1, ("imessaging_init failed\n"));
 		TALLOC_FREE(frame);
 		return NT_STATUS_INVALID_SERVER_STATE;
 	}
 
+	talloc_reparent(frame, msg_ctx, server_id);
+
 	server_credentials
 		= cli_credentials_init(frame);
 	if (!server_credentials) {
@@ -179,6 +190,7 @@ static NTSTATUS make_auth4_context_s4(TALLOC_CTX *mem_ctx,
 	struct tevent_context *event_ctx;
 	TALLOC_CTX *frame = talloc_stackframe();
 	struct imessaging_context *msg_ctx;
+	struct server_id *server_id;
 
 	lp_ctx = loadparm_init_s3(frame, loadparm_s3_context());
 	if (lp_ctx == NULL) {
@@ -193,14 +205,23 @@ static NTSTATUS make_auth4_context_s4(TALLOC_CTX *mem_ctx,
 		return NT_STATUS_INVALID_SERVER_STATE;
 	}
 
-	msg_ctx = imessaging_client_init(frame,
-					 lp_ctx,
-					 event_ctx);
+	server_id = new_server_id_task(frame);
+	if (server_id == NULL) {
+		DEBUG(1, ("new_server_id_task failed\n"));
+		TALLOC_FREE(frame);
+		return NT_STATUS_INVALID_SERVER_STATE;
+	}
+
+	msg_ctx = imessaging_init(frame,
+				  lp_ctx,
+				  *server_id,
+				  event_ctx, true);
 	if (msg_ctx == NULL) {
 		DEBUG(1, ("imessaging_init failed\n"));
 		TALLOC_FREE(frame);
 		return NT_STATUS_INVALID_SERVER_STATE;
 	}
+	talloc_reparent(frame, msg_ctx, server_id);
 
 	status = auth_context_create(mem_ctx,
 					event_ctx,
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 8392b68..c2c74fa 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -517,6 +517,7 @@ uint32 get_my_vnn(void);
 void set_my_unique_id(uint64_t unique_id);
 struct server_id pid_to_procid(pid_t pid);
 struct server_id procid_self(void);
+struct server_id *new_server_id_task(TALLOC_CTX *mem_ctx);
 bool procid_equal(const struct server_id *p1, const struct server_id *p2);
 bool cluster_id_equal(const struct server_id *id1,
 		      const struct server_id *id2);
diff --git a/source3/include/serverid.h b/source3/include/serverid.h
index 8fc06a1..1833f53 100644
--- a/source3/include/serverid.h
+++ b/source3/include/serverid.h
@@ -22,9 +22,6 @@
 
 #include "includes.h"
 
-/** Don't verify this unique id */
-#define SERVERID_UNIQUE_ID_NOT_TO_VERIFY 0xFFFFFFFFFFFFFFFFULL
-
 /*
  * Register a server with its unique id
  */
diff --git a/source3/lib/util.c b/source3/lib/util.c
index e43cfbb..7913ce9 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -2016,6 +2016,48 @@ struct server_id procid_self(void)
 	return pid_to_procid(getpid());
 }
 
+static struct idr_context *task_id_tree;
+
+static int free_task_id(struct server_id *server_id)
+{
+	idr_remove(task_id_tree, server_id->task_id);
+	return 0;
+}
+
+/* Return a server_id with a unique task_id element.  Free the
+ * returned pointer to de-allocate the task_id via a talloc destructor
+ * (ie, use talloc_free()) */
+struct server_id *new_server_id_task(TALLOC_CTX *mem_ctx)
+{
+	struct server_id *server_id;
+	int task_id;
+	if (!task_id_tree) {
+		task_id_tree = idr_init(NULL);
+		if (!task_id_tree) {
+			return NULL;
+		}
+	}
+
+	server_id = talloc(mem_ctx, struct server_id);
+
+	if (!server_id) {
+		return NULL;
+	}
+	*server_id = procid_self();
+
+	/* 0 is the default server_id, so we need to start with 1 */
+	task_id = idr_get_new_above(task_id_tree, server_id, 1, INT32_MAX);
+
+	if (task_id == -1) {
+		talloc_free(server_id);
+		return NULL;
+	}
+
+	talloc_set_destructor(server_id, free_task_id);
+	server_id->task_id = task_id;
+	return server_id;
+}
+
 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
 {
 	if (p1->pid != p2->pid)
diff --git a/source4/cluster/local.c b/source4/cluster/local.c
index 24cbe81..df67bcf 100644
--- a/source4/cluster/local.c
+++ b/source4/cluster/local.c
@@ -37,6 +37,9 @@ static struct server_id local_id(struct cluster_ops *ops, uint64_t pid, uint32_t
 	ZERO_STRUCT(server_id);
 	server_id.pid = pid;
 	server_id.task_id = task_id;
+	server_id.vnn = NONCLUSTER_VNN;
+	/* This is because we are not in the s3 serverid database */
+	server_id.unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY;
 	return server_id;
 }
 
diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c
index 80812c2..4d69b94 100644
--- a/source4/lib/messaging/messaging.c
+++ b/source4/lib/messaging/messaging.c
@@ -663,7 +663,12 @@ struct imessaging_context *imessaging_client_init(TALLOC_CTX *mem_ctx,
 {
 	struct server_id id;
 	ZERO_STRUCT(id);
-	id.pid = generate_random() % 0x10000000;
+	id.pid = getpid();
+	id.task_id = generate_random();
+	id.vnn = NONCLUSTER_VNN;
+
+	/* This is because we are not in the s3 serverid database */
+	id.unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY;
 
 	return imessaging_init(mem_ctx, lp_ctx, id, ev, true);
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list