[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