The branch, master has been updated
       via  ba01b21... s4:lib/registry/ldb.c - fix memory handling in 
"ldb_open_key"
       via  094c103... s4:lib/ldb/registry.c - handle the classname in the 
right way
       via  2fb3d8a... s4:lib/registry/ldb.c - remove really useless "local_ctx"
       via  3935502... s4:lib/registry/ldb.c - retrieve the classname correctly 
in "ldb_get_subkey_by_id"
       via  77e87e6... s4:lib/registry/ldb.c - change the "ldb_get_value" 
implementation to use the value cache and not an LDB lookup
      from  3549425...     s3: Change exit on immediate socket failure.

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


- Log -----------------------------------------------------------------
commit ba01b216e23ddae9961f7120792969fc2fe075b1
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Mon Jun 28 21:17:37 2010 +0200

    s4:lib/registry/ldb.c - fix memory handling in "ldb_open_key"

commit 094c1034d2fb11e746261ff5b5048cd52fce2938
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Mon Jun 28 21:15:17 2010 +0200

    s4:lib/ldb/registry.c - handle the classname in the right way
    
    This is for "ldb_get_key_info".

commit 2fb3d8a6cc94bd74974a2cc11996a2032774b08c
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Thu Jun 24 20:11:09 2010 +0200

    s4:lib/registry/ldb.c - remove really useless "local_ctx"
    
    "mem_ctx" should fit for these few local allocations.

commit 3935502c67edd436134bac0c663ed3d5b593ec32
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Thu Jun 24 16:17:16 2010 +0200

    s4:lib/registry/ldb.c - retrieve the classname correctly in 
"ldb_get_subkey_by_id"

commit 77e87e66b0e783cd0717f3fed885fcde629aa434
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Thu Jun 24 16:06:39 2010 +0200

    s4:lib/registry/ldb.c - change the "ldb_get_value" implementation to use 
the value cache and not an LDB lookup
    
    In addition this fixes the use of special characters in registry object 
names.

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

Summary of changes:
 source4/lib/registry/ldb.c |   74 ++++++++++++++++++++++----------------------
 1 files changed, 37 insertions(+), 37 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/registry/ldb.c b/source4/lib/registry/ldb.c
index 01d82e2..f0a1c43 100644
--- a/source4/lib/registry/ldb.c
+++ b/source4/lib/registry/ldb.c
@@ -35,6 +35,7 @@ struct ldb_key_data
        struct ldb_dn *dn;
        struct ldb_message **subkeys, **values;
        unsigned int subkey_count, value_count;
+       const char *classname;
 };
 
 static void reg_ldb_unpack_value(TALLOC_CTX *mem_ctx,
@@ -275,19 +276,15 @@ static struct ldb_dn *reg_path_to_ldb(TALLOC_CTX *mem_ctx,
                                      const struct hive_key *from,
                                      const char *path, const char *add)
 {
-       TALLOC_CTX *local_ctx;
        struct ldb_dn *ret;
        char *mypath = talloc_strdup(mem_ctx, path);
        char *begin;
        struct ldb_key_data *kd = talloc_get_type(from, struct ldb_key_data);
        struct ldb_context *ldb = kd->ldb;
 
-       local_ctx = talloc_new(mem_ctx);
-
        ret = ldb_dn_new(mem_ctx, ldb, add);
        if (!ldb_dn_validate(ret)) {
                talloc_free(ret);
-               talloc_free(local_ctx);
                return NULL;
        }
 
@@ -301,10 +298,10 @@ static struct ldb_dn *reg_path_to_ldb(TALLOC_CTX *mem_ctx,
 
                if (keyname[0] != '\0') {
                        if (!ldb_dn_add_base_fmt(ret, "key=%s",
-                                                reg_ldb_escape(local_ctx,
+                                                reg_ldb_escape(mem_ctx,
                                                                keyname)))
                        {
-                               talloc_free(local_ctx);
+                               talloc_free(ret);
                                return NULL;
                        }
                }
@@ -318,8 +315,6 @@ static struct ldb_dn *reg_path_to_ldb(TALLOC_CTX *mem_ctx,
 
        ldb_dn_add_base(ret, kd->dn);
 
-       talloc_free(local_ctx);
-
        return ret;
 }
 
@@ -372,14 +367,13 @@ static WERROR ldb_get_subkey_by_id(TALLOC_CTX *mem_ctx,
                                   const char **classname,
                                   NTTIME *last_mod_time)
 {
-       struct ldb_message_element *el;
        struct ldb_key_data *kd = talloc_get_type(k, struct ldb_key_data);
 
        /* Initialization */
        if (name != NULL)
                *name = NULL;
        if (classname != NULL)
-               *classname = NULL; /* TODO: Store properly */
+               *classname = NULL;
        if (last_mod_time != NULL)
                *last_mod_time = 0; /* TODO: we need to add this to the
                                                ldb backend properly */
@@ -392,12 +386,12 @@ static WERROR ldb_get_subkey_by_id(TALLOC_CTX *mem_ctx,
        if (idx >= kd->subkey_count)
                return WERR_NO_MORE_ITEMS;
 
-       el = ldb_msg_find_element(kd->subkeys[idx], "key");
-       SMB_ASSERT(el != NULL);
-       SMB_ASSERT(el->num_values != 0);
-
        if (name != NULL)
-               *name = talloc_strdup(mem_ctx, (char *)el->values[0].data);
+               *name = talloc_strdup(mem_ctx,
+                                     
ldb_msg_find_attr_as_string(kd->subkeys[idx], "key", NULL));
+       if (classname != NULL)
+               *classname = talloc_strdup(mem_ctx,
+                                          
ldb_msg_find_attr_as_string(kd->subkeys[idx], "classname", NULL));
 
        return WERR_OK;
 }
@@ -467,37 +461,34 @@ static WERROR ldb_get_value(TALLOC_CTX *mem_ctx, struct 
hive_key *k,
                            DATA_BLOB *data)
 {
        struct ldb_key_data *kd = talloc_get_type(k, struct ldb_key_data);
-       struct ldb_context *c = kd->ldb;
-       struct ldb_result *res;
-       int ret;
+       const char *res_name;
+       uint32_t idx;
 
        if (name == NULL) {
                return WERR_INVALID_PARAM;
        }
 
+       /* the default value was requested, give it back */
        if (name[0] == '\0') {
-               /* default value */
                return ldb_get_default_value(mem_ctx, k, NULL, data_type, data);
-       } else {
-               /* normal value */
-               ret = ldb_search(c, mem_ctx, &res, kd->dn, LDB_SCOPE_ONELEVEL,
-                                NULL, "(value=%s)", name);
-
-               if (ret != LDB_SUCCESS) {
-                       DEBUG(0, ("Error getting values for '%s': %s\n",
-                               ldb_dn_get_linearized(kd->dn), 
ldb_errstring(c)));
-                       return WERR_FOOBAR;
-               }
-
-               if (res->count == 0)
-                       return WERR_BADFILE;
+       }
 
-               reg_ldb_unpack_value(mem_ctx, res->msgs[0], NULL, data_type, 
data);
+       /* Do the search if necessary */
+       if (kd->values == NULL) {
+               W_ERROR_NOT_OK_RETURN(cache_values(kd));
+       }
 
-               talloc_free(res);
+       for (idx = 0; idx < kd->value_count; idx++) {
+               res_name = ldb_msg_find_attr_as_string(kd->values[idx], "value",
+                                                      "");
+               if (ldb_attr_cmp(name, res_name) == 0) {
+                       reg_ldb_unpack_value(mem_ctx, kd->values[idx], NULL,
+                                            data_type, data);
+                       return WERR_OK;
+               }
        }
 
-       return WERR_OK;
+       return WERR_BADFILE;
 }
 
 static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const struct hive_key *h,
@@ -531,9 +522,14 @@ static WERROR ldb_open_key(TALLOC_CTX *mem_ctx, const 
struct hive_key *h,
        }
 
        newkd = talloc_zero(mem_ctx, struct ldb_key_data);
+       W_ERROR_HAVE_NO_MEMORY(newkd);
        newkd->key.ops = &reg_backend_ldb;
        newkd->ldb = talloc_reference(newkd, kd->ldb);
-       newkd->dn = ldb_dn_copy(mem_ctx, res->msgs[0]->dn);
+       newkd->dn = ldb_dn_copy(newkd, res->msgs[0]->dn);
+       newkd->classname = talloc_steal(newkd,
+                                       
ldb_msg_find_attr_as_string(res->msgs[0], "classname", NULL);
+
+       talloc_free(res);
 
        *key = (struct hive_key *)newkd;
 
@@ -626,6 +622,7 @@ static WERROR ldb_add_key(TALLOC_CTX *mem_ctx, const struct 
hive_key *parent,
        newkd->ldb = talloc_reference(newkd, parentkd->ldb);
        newkd->key.ops = &reg_backend_ldb;
        newkd->dn = talloc_steal(newkd, msg->dn);
+       newkd->classname = talloc_steal(newkd, classname);
 
        *newkey = (struct hive_key *)newkd;
 
@@ -913,11 +910,14 @@ static WERROR ldb_get_key_info(TALLOC_CTX *mem_ctx,
        if (kd->subkeys == NULL) {
                W_ERROR_NOT_OK_RETURN(cache_subkeys(kd));
        }
-
        if (kd->values == NULL) {
                W_ERROR_NOT_OK_RETURN(cache_values(kd));
        }
 
+       if (classname != NULL) {
+               *classname = kd->classname;
+       }
+
        if (num_subkeys != NULL) {
                *num_subkeys = kd->subkey_count;
        }


-- 
Samba Shared Repository

Reply via email to