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 <[email protected]>
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 <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>
    
    Autobuild-User(master): Volker Lendecke <[email protected]>
    Autobuild-Date(master): Mon Jul 21 20:28:53 CEST 2014 on sn-devel-104

commit 53d1bbd20d252b7b759f6a5feb43a0f94b824437
Author: Volker Lendecke <[email protected]>
Date:   Thu Jul 17 14:54:32 2014 +0000

    messaging4: Fix a memleak in an error path
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit fe79d759dafef12af26da0a866969100c4aa065b
Author: Volker Lendecke <[email protected]>
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 <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit e64359ceb77142856bdd32187f377cfc0fc51674
Author: Volker Lendecke <[email protected]>
Date:   Thu Jul 17 14:11:35 2014 +0000

    messaging4: Remove an unused NTSTATUS var
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 5db77591f51676461073acde9a1e0ab0eb1622b4
Author: Volker Lendecke <[email protected]>
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 <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 1603d2df592fb1861467e02de4bcadcc6772f162
Author: Volker Lendecke <[email protected]>
Date:   Thu Jul 17 14:08:58 2014 +0000

    messaging4: Add NULL check to irpc_add_name
    
    Signed-off-by: Volker Lendecke <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

commit 658b7ec4eef5227f7b0e7470faae043509dac24d
Author: Volker Lendecke <[email protected]>
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 <[email protected]>
    Reviewed-by: Stefan Metzmacher <[email protected]>

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

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

Reply via email to