[SCM] Samba Shared Repository - branch master updated

Volker Lendecke vlendec at samba.org
Mon Jul 21 12:29:03 MDT 2014


The branch, master has been updated
       via  1dd6434 messaging4: Change irpc_servers_by_name to NTSTATUS
       via  53d1bbd messaging4: Fix a memleak in an error path
       via  fe79d75 messaging4: Remove unnecessary locking
       via  e64359c messaging4: Remove an unused NTSTATUS var
       via  5db7759 messaging4: Move str_list_add
       via  1603d2d messaging4: Add NULL check to irpc_add_name
       via  658b7ec messaging4: Use tdb_append in irpc_add_name
      from  705e417 ctdb-recoverd: Gently abort recovery when election is underway

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


- Log -----------------------------------------------------------------
commit 1dd64341d801d9adc66aa6432dc3afb64644e29b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 15:05:30 2014 +0000

    messaging4: Change irpc_servers_by_name to NTSTATUS
    
    For me, counted arrays are easier to deal with than NULL-terminated
    ones. Here we also had a "server_id_is_disconnection" convention, which
    was not really obvious.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User(master): Volker Lendecke <vl at samba.org>
    Autobuild-Date(master): Mon Jul 21 20:28:53 CEST 2014 on sn-devel-104

commit 53d1bbd20d252b7b759f6a5feb43a0f94b824437
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:54:32 2014 +0000

    messaging4: Fix a memleak in an error path
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit fe79d759dafef12af26da0a866969100c4aa065b
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:50:33 2014 +0000

    messaging4: Remove unnecessary locking
    
    We don't do any modifying operations on the database, so locking is not
    needed here
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit e64359ceb77142856bdd32187f377cfc0fc51674
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:11:35 2014 +0000

    messaging4: Remove an unused NTSTATUS var
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 5db77591f51676461073acde9a1e0ab0eb1622b4
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:09:14 2014 +0000

    messaging4: Move str_list_add
    
    If this fails, we'd have to revert the tdb_append. str_list_remove is
    simpler :-)
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 1603d2df592fb1861467e02de4bcadcc6772f162
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:08:58 2014 +0000

    messaging4: Add NULL check to irpc_add_name
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 658b7ec4eef5227f7b0e7470faae043509dac24d
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jul 17 14:07:45 2014 +0000

    messaging4: Use tdb_append in irpc_add_name
    
    This makes the custom locking code unnecessary here
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

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

Summary of changes:
 source4/dsdb/samdb/ldb_modules/ridalloc.c |   12 ++--
 source4/lib/messaging/irpc.h              |    5 +-
 source4/lib/messaging/messaging.c         |   89 ++++++++++++++---------------
 source4/lib/messaging/pymessaging.c       |   18 +++---
 4 files changed, 61 insertions(+), 63 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/ridalloc.c b/source4/dsdb/samdb/ldb_modules/ridalloc.c
index f6738f9..05764ee 100644
--- a/source4/dsdb/samdb/ldb_modules/ridalloc.c
+++ b/source4/dsdb/samdb/ldb_modules/ridalloc.c
@@ -67,7 +67,8 @@
 static int ridalloc_poke_rid_manager(struct ldb_module *module)
 {
 	struct imessaging_context *msg;
-	struct server_id *server;
+	unsigned num_servers;
+	struct server_id *servers;
 	struct ldb_context *ldb = ldb_module_get_ctx(module);
 	struct loadparm_context *lp_ctx =
 		(struct loadparm_context *)ldb_get_opaque(ldb, "loadparm");
@@ -85,8 +86,9 @@ static int ridalloc_poke_rid_manager(struct ldb_module *module)
 		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
 
-	server = irpc_servers_byname(msg, msg, "dreplsrv");
-	if (!server) {
+	status = irpc_servers_byname(msg, msg, "dreplsrv",
+				     &num_servers, &servers);
+	if (!NT_STATUS_IS_OK(status)) {
 		ldb_asprintf_errstring(ldb_module_get_ctx(module),
 				"Failed to send MSG_DREPL_ALLOCATE_RID, "
 				"unable to locate dreplsrv");
@@ -95,13 +97,13 @@ static int ridalloc_poke_rid_manager(struct ldb_module *module)
 		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
 
-	status = imessaging_send(msg, server[0], MSG_DREPL_ALLOCATE_RID, NULL);
+	status = imessaging_send(msg, servers[0], MSG_DREPL_ALLOCATE_RID, NULL);
 
 	/* Only error out if an error happened, not on STATUS_MORE_ENTRIES, ie a delayed message */
 	if (NT_STATUS_IS_ERR(status)) {
 		ldb_asprintf_errstring(ldb_module_get_ctx(module),
 				"Failed to send MSG_DREPL_ALLOCATE_RID to dreplsrv at %s: %s",
-				server_id_str(tmp_ctx, server), nt_errstr(status));
+				server_id_str(tmp_ctx, servers), nt_errstr(status));
 		talloc_free(tmp_ctx);
 		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
diff --git a/source4/lib/messaging/irpc.h b/source4/lib/messaging/irpc.h
index 96f67e1..ebf30af 100644
--- a/source4/lib/messaging/irpc.h
+++ b/source4/lib/messaging/irpc.h
@@ -73,7 +73,10 @@ void irpc_binding_handle_add_security_token(struct dcerpc_binding_handle *h,
 					    struct security_token *token);
 
 NTSTATUS irpc_add_name(struct imessaging_context *msg_ctx, const char *name);
-struct server_id *irpc_servers_byname(struct imessaging_context *msg_ctx, TALLOC_CTX *mem_ctx, const char *name);
+NTSTATUS irpc_servers_byname(struct imessaging_context *msg_ctx,
+			     TALLOC_CTX *mem_ctx, const char *name,
+			     unsigned *num_servers,
+			     struct server_id **servers);
 struct irpc_name_records *irpc_all_servers(struct imessaging_context *msg_ctx,
 					   TALLOC_CTX *mem_ctx);
 void irpc_remove_name(struct imessaging_context *msg_ctx, const char *name);
diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c
index 66732ce..137d859 100644
--- a/source4/lib/messaging/messaging.c
+++ b/source4/lib/messaging/messaging.c
@@ -924,69 +924,65 @@ static struct tdb_wrap *irpc_namedb_open(TALLOC_CTX *mem_ctx, const char *base_p
 */
 NTSTATUS irpc_add_name(struct imessaging_context *msg_ctx, const char *name)
 {
-	struct tdb_wrap *t = msg_ctx->names_db;
-	TDB_DATA rec;
-	int count;
-	NTSTATUS status = NT_STATUS_OK;
+	struct tdb_context *t = msg_ctx->names_db->tdb;
+	struct server_id pid = msg_ctx->server_id;
+	TDB_DATA key, data;
+	int ret;
 
-	if (tdb_lock_bystring(t->tdb, name) != 0) {
-		return NT_STATUS_LOCK_NOT_GRANTED;
-	}
-	rec = tdb_fetch_bystring(t->tdb, name);
-	count = rec.dsize / sizeof(struct server_id);
-	rec.dptr = (unsigned char *)realloc_p(rec.dptr, struct server_id, count+1);
-	rec.dsize += sizeof(struct server_id);
-	if (rec.dptr == NULL) {
-		tdb_unlock_bystring(t->tdb, name);
+	msg_ctx->names = str_list_add(msg_ctx->names, name);
+	if (msg_ctx->names == NULL) {
 		return NT_STATUS_NO_MEMORY;
 	}
-	((struct server_id *)rec.dptr)[count] = msg_ctx->server_id;
-	if (tdb_store_bystring(t->tdb, name, rec, 0) != 0) {
-		status = NT_STATUS_INTERNAL_ERROR;
-	}
-	free(rec.dptr);
-	tdb_unlock_bystring(t->tdb, name);
-
-	msg_ctx->names = str_list_add(msg_ctx->names, name);
 	talloc_steal(msg_ctx, msg_ctx->names);
 
-	return status;
+	key = string_term_tdb_data(name);
+	data = (TDB_DATA) { .dptr = (uint8_t *)&pid, .dsize = sizeof(pid) };
+
+	ret = tdb_append(t, key, data);
+	if (ret != 0) {
+		enum TDB_ERROR err = tdb_error(t);
+		str_list_remove(msg_ctx->names, name);
+		return map_nt_error_from_tdb(err);
+	}
+
+	return NT_STATUS_OK;
 }
 
 /*
   return a list of server ids for a server name
 */
-struct server_id *irpc_servers_byname(struct imessaging_context *msg_ctx,
-				      TALLOC_CTX *mem_ctx,
-				      const char *name)
+NTSTATUS irpc_servers_byname(struct imessaging_context *msg_ctx,
+			     TALLOC_CTX *mem_ctx, const char *name,
+			     unsigned *num_servers,
+			     struct server_id **servers)
 {
 	struct tdb_wrap *t = msg_ctx->names_db;
 	TDB_DATA rec;
-	int count, i;
+	unsigned count;
 	struct server_id *ret;
 
-	if (tdb_lock_bystring(t->tdb, name) != 0) {
-		return NULL;
-	}
 	rec = tdb_fetch_bystring(t->tdb, name);
 	if (rec.dptr == NULL) {
-		tdb_unlock_bystring(t->tdb, name);
-		return NULL;
+		enum TDB_ERROR err = tdb_error(t->tdb);
+		return map_nt_error_from_tdb(err);
 	}
+
 	count = rec.dsize / sizeof(struct server_id);
-	ret = talloc_array(mem_ctx, struct server_id, count+1);
-	if (ret == NULL) {
-		tdb_unlock_bystring(t->tdb, name);
-		return NULL;
+	if (count == 0) {
+		return NT_STATUS_NOT_FOUND;
 	}
-	for (i=0;i<count;i++) {
-		ret[i] = ((struct server_id *)rec.dptr)[i];
+
+	ret = talloc_array(mem_ctx, struct server_id, count);
+	if (ret == NULL) {
+		free(rec.dptr);
+		return NT_STATUS_NO_MEMORY;
 	}
-	server_id_set_disconnected(&ret[i]);
+	memcpy(ret, rec.dptr, count * sizeof(struct server_id));
 	free(rec.dptr);
-	tdb_unlock_bystring(t->tdb, name);
 
-	return ret;
+	*num_servers = count;
+	*servers = ret;
+	return NT_STATUS_OK;
 }
 
 static int all_servers_func(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *state)
@@ -1390,17 +1386,16 @@ struct dcerpc_binding_handle *irpc_binding_handle_by_name(TALLOC_CTX *mem_ctx,
 							  const struct ndr_interface_table *table)
 {
 	struct dcerpc_binding_handle *h;
+	unsigned num_sids;
 	struct server_id *sids;
 	struct server_id sid;
+	NTSTATUS status;
 
 	/* find the server task */
-	sids = irpc_servers_byname(msg_ctx, mem_ctx, dest_task);
-	if (sids == NULL) {
-		errno = EADDRNOTAVAIL;
-		return NULL;
-	}
-	if (server_id_is_disconnected(&sids[0])) {
-		talloc_free(sids);
+
+	status = irpc_servers_byname(msg_ctx, mem_ctx, dest_task,
+				     &num_sids, &sids);
+	if (!NT_STATUS_IS_OK(status)) {
 		errno = EADDRNOTAVAIL;
 		return NULL;
 	}
diff --git a/source4/lib/messaging/pymessaging.c b/source4/lib/messaging/pymessaging.c
index 62370ae..1e9588c 100644
--- a/source4/lib/messaging/pymessaging.c
+++ b/source4/lib/messaging/pymessaging.c
@@ -235,10 +235,12 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
 {
 	imessaging_Object *iface = (imessaging_Object *)self;
 	char *server_name;
+	unsigned i, num_ids;
 	struct server_id *ids;
 	PyObject *pylist;
-	int i;
 	TALLOC_CTX *mem_ctx = talloc_new(NULL);
+	NTSTATUS status;
+
 	if (!mem_ctx) {
 		PyErr_NoMemory();
 		return NULL;
@@ -249,25 +251,21 @@ static PyObject *py_irpc_servers_byname(PyObject *self, PyObject *args, PyObject
 		return NULL;
 	}
 
-	ids = irpc_servers_byname(iface->msg_ctx, mem_ctx, server_name);
-
-	if (ids == NULL) {
+	status = irpc_servers_byname(iface->msg_ctx, mem_ctx, server_name,
+				     &num_ids, &ids);
+	if (!NT_STATUS_IS_OK(status)) {
 		TALLOC_FREE(mem_ctx);
 		PyErr_SetString(PyExc_KeyError, "No such name");
 		return NULL;
 	}
 
-	for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
-		/* Do nothing */
-	}
-
-	pylist = PyList_New(i);
+	pylist = PyList_New(num_ids);
 	if (pylist == NULL) {
 		TALLOC_FREE(mem_ctx);
 		PyErr_NoMemory();
 		return NULL;
 	}
-	for (i = 0; !server_id_is_disconnected(&ids[i]); i++) {
+	for (i = 0; i < num_ids; i++) {
 		PyObject *py_server_id;
 		struct server_id *p_server_id = talloc(NULL, struct server_id);
 		if (!p_server_id) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list