[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Mon Mar 22 15:31:45 MDT 2010


The branch, master has been updated
       via  12f42e3... s4:registry - "reg_import_hive_key" - change a "talloc_steal" into a "talloc_reference"
       via  e246633... s4:registry - "patchfile" - add another "W_ERROR_HAVE_NO_MEMORY" macro call
       via  8046cbe... s4:registry - "local" - add also here more "W_ERROR_HAVE_NO_MEMORY" macro tests
       via  e690c07... s4:registry - "util.c" - initialise "result" in "reg_key_add_abs"
       via  0c10703... s4:WINREG RPC - add also here a "W_ERROR_HAVE_NO_MEMORY"
       via  e78289f... s4:registry - "samba.c" - add a "talloc_free"
       via  dc17292... s4:registry - add more "W_ERROR_HAVE_NO_MEMORY" invocations (on talloc'ed stuff)
       via  9c3e624... s4:registry - "util" - remove "const" from "reg_abs_path"
       via  5f850af... s4:registry - adaptions for "add also a memory context argument for "reg_key_del_abs"
       via  5b6ad54... s4:registry - "util" - add also a memory context argument for "reg_key_del_abs"
       via  9d85929... s4:registry - "util" - make "reg_key_add_abs" consistent with "reg_key_del_abs"
       via  05d8882... s4:registry - "util" - fix up memory allocated data
       via  96bb09b... s4:registry - "dir.c" - fix up dynamic memory allocation operations
       via  43170da... s4:registry - adaptions for "add memory contexts for delete value/key functions"
       via  64f5138... s4:registry - registry.h - add memory contexts for delete value/key functions
      from  e2c7e5c... tdb: Fix bug 7248, avoid the nanosleep dependency

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


- Log -----------------------------------------------------------------
commit 12f42e35bcbb819cb742c28538b7cc67ac9d93cf
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 22:23:08 2010 +0100

    s4:registry - "reg_import_hive_key" - change a "talloc_steal" into a "talloc_reference"
    
    Use a "talloc_reference" since the "hive" variable can continue to exist also
    after the destructed "struct local_key" object. It is also referenced by the
    "mountpoints" structure under the "ctx" object.

commit e2466334a07062ca9c7160c8487386e1743d982a
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 22:01:31 2010 +0100

    s4:registry - "patchfile" - add another "W_ERROR_HAVE_NO_MEMORY" macro call

commit 8046cbe3c1b2a61081ef091398ec0ff2183e7a0d
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 21:46:39 2010 +0100

    s4:registry - "local" - add also here more "W_ERROR_HAVE_NO_MEMORY" macro tests

commit e690c0776fa4d3a475e9291c243be6141d54b4d4
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 21:34:54 2010 +0100

    s4:registry - "util.c" - initialise "result" in "reg_key_add_abs"

commit 0c10703c756117ad1a8c9e911157cd9ca81f0f70
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 20:14:51 2010 +0100

    s4:WINREG RPC - add also here a "W_ERROR_HAVE_NO_MEMORY"

commit e78289f167363f3617f7417f7e25de369ea22d7f
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 20:12:13 2010 +0100

    s4:registry - "samba.c" - add a "talloc_free"

commit dc17292f1a097d3abd8c391315b661034ab1914e
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 20:10:26 2010 +0100

    s4:registry - add more "W_ERROR_HAVE_NO_MEMORY" invocations (on talloc'ed stuff)

commit 9c3e6249fd984b823a77cab0514601d2a487920a
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:53:23 2010 +0100

    s4:registry - "util" - remove "const" from "reg_abs_path"
    
    Here it's not really needed

commit 5f850af84aec378780b5caeff9e795297654abcc
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:56:52 2010 +0100

    s4:registry - adaptions for "add also a memory context argument for "reg_key_del_abs"

commit 5b6ad54f43741c0c25b35e44cafe5fed352ff133
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:47:49 2010 +0100

    s4:registry - "util" - add also a memory context argument for "reg_key_del_abs"

commit 9d8592978e28c492d971a3b5a4c0133febc149ea
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:45:21 2010 +0100

    s4:registry - "util" - make "reg_key_add_abs" consistent with "reg_key_del_abs"

commit 05d8882a966708f994688fce3b978abb1432bc40
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:44:19 2010 +0100

    s4:registry - "util" - fix up memory allocated data

commit 96bb09bcf6ed221b1ce11dd4ec91b64d53ff6626
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:26:59 2010 +0100

    s4:registry - "dir.c" - fix up dynamic memory allocation operations
    
    - Added free operations where needed
    - Use always the "mem_ctx" for temporary data
    - Proof with W_ERROR_HAVE_NO_MEMORY if stuff was allocated

commit 43170dafbcbe7464bce9b4c6d76532d7d0bf5b9a
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 19:18:56 2010 +0100

    s4:registry - adaptions for "add memory contexts for delete value/key functions"

commit 64f51380aad484d020093c926512ec79a35bcb93
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 18:51:20 2010 +0100

    s4:registry - registry.h - add memory contexts for delete value/key functions

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

Summary of changes:
 source4/lib/registry/dir.c              |   71 +++++++++++++++++++++++-------
 source4/lib/registry/hive.c             |   10 +++--
 source4/lib/registry/interface.c        |   10 +++--
 source4/lib/registry/ldb.c              |   29 ++++---------
 source4/lib/registry/local.c            |   44 ++++++++++++++-----
 source4/lib/registry/patchfile.c        |    7 ++-
 source4/lib/registry/patchfile_dotreg.c |    3 +
 source4/lib/registry/pyregistry.c       |    8 ++--
 source4/lib/registry/regf.c             |   17 +++++--
 source4/lib/registry/registry.h         |   27 ++++++++----
 source4/lib/registry/rpc.c              |    9 ++--
 source4/lib/registry/samba.c            |    3 +
 source4/lib/registry/tests/hive.c       |   14 +++---
 source4/lib/registry/tests/registry.c   |    6 +-
 source4/lib/registry/tools/regshell.c   |    4 +-
 source4/lib/registry/util.c             |   32 ++++++++------
 source4/rpc_server/winreg/rpc_winreg.c  |    5 +-
 17 files changed, 189 insertions(+), 110 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/registry/dir.c b/source4/lib/registry/dir.c
index 4380dce..b1f0965 100644
--- a/source4/lib/registry/dir.c
+++ b/source4/lib/registry/dir.c
@@ -40,9 +40,11 @@ static WERROR reg_dir_add_key(TALLOC_CTX *mem_ctx,
 	int ret;
 
 	path = talloc_asprintf(mem_ctx, "%s/%s", dk->path, name);
+	W_ERROR_HAVE_NO_MEMORY(path);
 	ret = mkdir(path, 0700);
 	if (ret == 0) {
 		struct dir_key *key = talloc(mem_ctx, struct dir_key);
+		W_ERROR_HAVE_NO_MEMORY(key);
 		key->key.ops = &reg_backend_dir;
 		key->path = talloc_steal(key, path);
 		*result = (struct hive_key *)key;
@@ -76,8 +78,7 @@ static WERROR reg_dir_delete_recursive(const char *name)
 			continue;
 
 		path = talloc_asprintf(name, "%s/%s", name, e->d_name);
-		if (!path)
-			return WERR_NOMEM;
+		W_ERROR_HAVE_NO_MEMORY(path);
 
 		stat(path, &stbuf);
 
@@ -108,12 +109,16 @@ static WERROR reg_dir_delete_recursive(const char *name)
 		return WERR_GENERAL_FAILURE;
 }
 
-static WERROR reg_dir_del_key(const struct hive_key *k, const char *name)
+static WERROR reg_dir_del_key(TALLOC_CTX *mem_ctx, const struct hive_key *k,
+			      const char *name)
 {
 	struct dir_key *dk = talloc_get_type(k, struct dir_key);
-	char *child = talloc_asprintf(NULL, "%s/%s", dk->path, name);
+	char *child;
 	WERROR ret;
 
+	child = talloc_asprintf(mem_ctx, "%s/%s", dk->path, name);
+	W_ERROR_HAVE_NO_MEMORY(child);
+
 	ret = reg_dir_delete_recursive(child);
 
 	talloc_free(child);
@@ -136,11 +141,13 @@ static WERROR reg_dir_open_key(TALLOC_CTX *mem_ctx,
 	}
 
 	fullpath = talloc_asprintf(mem_ctx, "%s/%s", p->path, name);
+	W_ERROR_HAVE_NO_MEMORY(fullpath);
 
 	d = opendir(fullpath);
 	if (d == NULL) {
 		DEBUG(3,("Unable to open '%s': %s\n", fullpath,
 			strerror(errno)));
+		talloc_free(fullpath);
 		return WERR_BADFILE;
 	}
 	closedir(d);
@@ -173,27 +180,30 @@ static WERROR reg_dir_key_by_index(TALLOC_CTX *mem_ctx,
 			char *thispath;
 
 			/* Check if file is a directory */
-			asprintf(&thispath, "%s/%s", dk->path, e->d_name);
+			thispath = talloc_asprintf(mem_ctx, "%s/%s", dk->path,
+						   e->d_name);
+			W_ERROR_HAVE_NO_MEMORY(thispath);
 			stat(thispath, &stbuf);
 
 			if (!S_ISDIR(stbuf.st_mode)) {
-				SAFE_FREE(thispath);
+				talloc_free(thispath);
 				continue;
 			}
 
 			if (i == idx) {
 				struct stat st;
 				*name = talloc_strdup(mem_ctx, e->d_name);
+				W_ERROR_HAVE_NO_MEMORY(*name);
 				*classname = NULL;
 				stat(thispath, &st);
 				unix_to_nt_time(last_mod_time, st.st_mtime);
-				SAFE_FREE(thispath);
+				talloc_free(thispath);
 				closedir(d);
 				return WERR_OK;
 			}
 			i++;
 
-			SAFE_FREE(thispath);
+			talloc_free(thispath);
 		}
 	}
 
@@ -211,6 +221,7 @@ WERROR reg_open_directory(TALLOC_CTX *parent_ctx,
 		return WERR_INVALID_PARAM;
 
 	dk = talloc(parent_ctx, struct dir_key);
+	W_ERROR_HAVE_NO_MEMORY(dk);
 	dk->key.ops = &reg_backend_dir;
 	dk->path = talloc_strdup(dk, location);
 	*key = (struct hive_key *)dk;
@@ -270,10 +281,12 @@ static WERROR reg_dir_get_info(TALLOC_CTX *ctx, const struct hive_key *key,
 		if(!ISDOT(e->d_name) && !ISDOTDOT(e->d_name)) {
 			char *path = talloc_asprintf(ctx, "%s/%s",
 						     dk->path, e->d_name);
+			W_ERROR_HAVE_NO_MEMORY(path);
 
 			if (stat(path, &st) < 0) {
 				DEBUG(0, ("Error statting %s: %s\n", path,
 					strerror(errno)));
+				talloc_free(path);
 				continue;
 			}
 
@@ -308,10 +321,19 @@ static WERROR reg_dir_set_value(struct hive_key *key, const char *name,
 				uint32_t type, const DATA_BLOB data)
 {
 	const struct dir_key *dk = talloc_get_type(key, struct dir_key);
-	char *path = talloc_asprintf(dk, "%s/%s", dk->path, name);
+	char *path;
+	bool ret;
+
+	path = talloc_asprintf(dk, "%s/%s", dk->path, name);
+	W_ERROR_HAVE_NO_MEMORY(path);
+
+	ret = file_save(path, data.data, data.length);
+
+	talloc_free(path);
 
-	if (!file_save(path, data.data, data.length))
+	if (!ret) {
 		return WERR_GENERAL_FAILURE;
+	}
 
 	/* FIXME: Type */
 
@@ -323,12 +345,17 @@ static WERROR reg_dir_get_value(TALLOC_CTX *mem_ctx,
 				uint32_t *type, DATA_BLOB *data)
 {
 	const struct dir_key *dk = talloc_get_type(key, struct dir_key);
-	char *path = talloc_asprintf(mem_ctx, "%s/%s", dk->path, name);
+	char *path;
 	size_t size;
 	char *contents;
 
+	path = talloc_asprintf(mem_ctx, "%s/%s", dk->path, name);
+	W_ERROR_HAVE_NO_MEMORY(path);
+
 	contents = file_load(path, &size, 0, mem_ctx);
+
 	talloc_free(path);
+
 	if (contents == NULL)
 		return WERR_BADFILE;
 
@@ -364,8 +391,10 @@ static WERROR reg_dir_enum_value(TALLOC_CTX *mem_ctx,
 			continue;
 
 		if (i == idx) {
-			if (name != NULL)
+			if (name != NULL) {
 				*name = talloc_strdup(mem_ctx, e->d_name);
+				W_ERROR_HAVE_NO_MEMORY(*name);
+			}
 			W_ERROR_NOT_OK_RETURN(reg_dir_get_value(mem_ctx, key,
 								*name, type,
 								data));
@@ -380,17 +409,25 @@ static WERROR reg_dir_enum_value(TALLOC_CTX *mem_ctx,
 }
 
 
-static WERROR reg_dir_del_value (struct hive_key *key, const char *name)
+static WERROR reg_dir_del_value(TALLOC_CTX *mem_ctx,
+				struct hive_key *key, const char *name)
 {
 	const struct dir_key *dk = talloc_get_type(key, struct dir_key);
-	char *path = talloc_asprintf(key, "%s/%s", dk->path, name);
-	if (unlink(path) < 0) {
-		talloc_free(path);
+	char *path;
+	int ret;
+
+	path = talloc_asprintf(mem_ctx, "%s/%s", dk->path, name);
+	W_ERROR_HAVE_NO_MEMORY(path);
+
+	ret = unlink(path);
+
+	talloc_free(path);
+
+	if (ret < 0) {
 		if (errno == ENOENT)
 			return WERR_BADFILE;
 		return WERR_GENERAL_FAILURE;
 	}
-	talloc_free(path);
 
 	return WERR_OK;
 }
diff --git a/source4/lib/registry/hive.c b/source4/lib/registry/hive.c
index 8bf7c9f..c9cb247 100644
--- a/source4/lib/registry/hive.c
+++ b/source4/lib/registry/hive.c
@@ -91,9 +91,10 @@ _PUBLIC_ WERROR hive_key_add_name(TALLOC_CTX *ctx,
 					desc, key);
 }
 
-_PUBLIC_ WERROR hive_key_del(const struct hive_key *key, const char *name)
+_PUBLIC_ WERROR hive_key_del(TALLOC_CTX *mem_ctx, const struct hive_key *key,
+			     const char *name)
 {
-	return key->ops->del_key(key, name);
+	return key->ops->del_key(mem_ctx, key, name);
 }
 
 _PUBLIC_ WERROR hive_get_key_by_name(TALLOC_CTX *mem_ctx,
@@ -163,12 +164,13 @@ WERROR hive_set_sec_desc(struct hive_key *key,
 	return key->ops->set_sec_desc(key, security);
 }
 
-WERROR hive_key_del_value(struct hive_key *key, const char *name)
+WERROR hive_key_del_value(TALLOC_CTX *mem_ctx, struct hive_key *key,
+			  const char *name)
 {
 	if (key->ops->delete_value == NULL)
 		return WERR_NOT_SUPPORTED;
 
-	return key->ops->delete_value(key, name);
+	return key->ops->delete_value(mem_ctx, key, name);
 }
 
 WERROR hive_key_flush(struct hive_key *key)
diff --git a/source4/lib/registry/interface.c b/source4/lib/registry/interface.c
index 5d24f6d..c5d5ce8 100644
--- a/source4/lib/registry/interface.c
+++ b/source4/lib/registry/interface.c
@@ -185,7 +185,8 @@ _PUBLIC_ WERROR reg_key_get_value_by_name(TALLOC_CTX *mem_ctx,
 /**
  * Delete a key.
  */
-_PUBLIC_ WERROR reg_key_del(struct registry_key *parent, const char *name)
+_PUBLIC_ WERROR reg_key_del(TALLOC_CTX *mem_ctx, struct registry_key *parent,
+			    const char *name)
 {
 	if (parent == NULL)
 		return WERR_INVALID_PARAM;
@@ -193,7 +194,7 @@ _PUBLIC_ WERROR reg_key_del(struct registry_key *parent, const char *name)
 	if (parent->context->ops->delete_key == NULL)
 		return WERR_NOT_SUPPORTED;
 
-	return parent->context->ops->delete_key(parent, name);
+	return parent->context->ops->delete_key(mem_ctx, parent, name);
 }
 
 /**
@@ -257,7 +258,8 @@ _PUBLIC_ WERROR reg_get_sec_desc(TALLOC_CTX *ctx,
 /**
  * Delete a value.
  */
-_PUBLIC_ WERROR reg_del_value(struct registry_key *key, const char *valname)
+_PUBLIC_ WERROR reg_del_value(TALLOC_CTX *mem_ctx, struct registry_key *key,
+			      const char *valname)
 {
 	if (key == NULL)
 		return WERR_INVALID_PARAM;
@@ -265,7 +267,7 @@ _PUBLIC_ WERROR reg_del_value(struct registry_key *key, const char *valname)
 	if (key->context->ops->delete_value == NULL)
 		return WERR_NOT_SUPPORTED;
 
-	return key->context->ops->delete_value(key, valname);
+	return key->context->ops->delete_value(mem_ctx, key, valname);
 }
 
 /**
diff --git a/source4/lib/registry/ldb.c b/source4/lib/registry/ldb.c
index 7ceaa5b..8310b6f 100644
--- a/source4/lib/registry/ldb.c
+++ b/source4/lib/registry/ldb.c
@@ -712,18 +712,16 @@ static WERROR ldb_add_key(TALLOC_CTX *mem_ctx, const struct hive_key *parent,
 	return WERR_OK;
 }
 
-static WERROR ldb_del_value (struct hive_key *key, const char *child)
+static WERROR ldb_del_value(TALLOC_CTX *mem_ctx, struct hive_key *key,
+			    const char *child)
 {
 	int ret;
 	struct ldb_key_data *kd = talloc_get_type(key, struct ldb_key_data);
-	TALLOC_CTX *mem_ctx;
 	struct ldb_message *msg;
 	struct ldb_dn *childdn;
 
 	if ((child == NULL) || (child[0] == '\0')) {
 		/* default value */
-		mem_ctx = talloc_init("ldb_del_value");
-
 		msg = talloc_zero(mem_ctx, struct ldb_message);
 		W_ERROR_HAVE_NO_MEMORY(msg);
 		msg->dn = ldb_dn_copy(msg, kd->dn);
@@ -734,11 +732,8 @@ static WERROR ldb_del_value (struct hive_key *key, const char *child)
 		ret = ldb_modify(kd->ldb, msg);
 		if (ret != LDB_SUCCESS) {
 			DEBUG(1, ("ldb_del_value: %s\n", ldb_errstring(kd->ldb)));
-			talloc_free(mem_ctx);
 			return WERR_FOOBAR;
 		}
-
-		talloc_free(mem_ctx);
 	} else {
 		/* normal value */
 		childdn = ldb_dn_copy(kd->ldb, kd->dn);
@@ -768,13 +763,13 @@ static WERROR ldb_del_value (struct hive_key *key, const char *child)
 	return WERR_OK;
 }
 
-static WERROR ldb_del_key(const struct hive_key *key, const char *name)
+static WERROR ldb_del_key(TALLOC_CTX *mem_ctx, const struct hive_key *key,
+			  const char *name)
 {
 	unsigned int i;
 	int ret;
 	struct ldb_key_data *parentkd = talloc_get_type(key, struct ldb_key_data);
 	struct ldb_dn *ldap_path;
-	TALLOC_CTX *mem_ctx = talloc_init("ldb_del_key");
 	struct ldb_context *c = parentkd->ldb;
 	struct ldb_result *res_keys;
 	struct ldb_result *res_vals;
@@ -784,7 +779,6 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 	/* Verify key exists by opening it */
 	werr = ldb_open_key(mem_ctx, key, name, &hk);
 	if (!W_ERROR_IS_OK(werr)) {
-		talloc_free(mem_ctx);
 		return werr;
 	}
 
@@ -798,7 +792,6 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 	if (ret != LDB_SUCCESS) {
 		DEBUG(0, ("Error getting subkeys for '%s': %s\n",
 		      ldb_dn_get_linearized(ldap_path), ldb_errstring(c)));
-		talloc_free(mem_ctx);
 		return WERR_FOOBAR;
 	}
 
@@ -809,7 +802,6 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 	if (ret != LDB_SUCCESS) {
 		DEBUG(0, ("Error getting values for '%s': %s\n",
 		      ldb_dn_get_linearized(ldap_path), ldb_errstring(c)));
-		talloc_free(mem_ctx);
 		return WERR_FOOBAR;
 	}
 
@@ -818,7 +810,6 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 
 	if (ret != LDB_SUCCESS) {
 		DEBUG(0, ("ldb_transaction_start: %s\n", ldb_errstring(c)));
-		talloc_free(mem_ctx);
 		return WERR_FOOBAR;
 	}
 
@@ -827,12 +818,12 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 		/* Delete any subkeys */
 		for (i = 0; i < res_keys->count; i++)
 		{
-			werr = ldb_del_key(hk, ldb_msg_find_attr_as_string(
+			werr = ldb_del_key(mem_ctx, hk,
+					   ldb_msg_find_attr_as_string(
 							res_keys->msgs[i],
 							"key", NULL));
 			if (!W_ERROR_IS_OK(werr)) {
 				ret = ldb_transaction_cancel(c);
-				talloc_free(mem_ctx);
 				return werr;
 			}
 		}
@@ -840,12 +831,12 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 		/* Delete any values */
 		for (i = 0; i < res_vals->count; i++)
 		{
-			werr = ldb_del_value(hk, ldb_msg_find_attr_as_string(
+			werr = ldb_del_value(mem_ctx, hk,
+					     ldb_msg_find_attr_as_string(
 							res_vals->msgs[i],
 							"value", NULL));
 			if (!W_ERROR_IS_OK(werr)) {
 				ret = ldb_transaction_cancel(c);
-				talloc_free(mem_ctx);
 				return werr;
 			}
 		}
@@ -858,7 +849,6 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 	{
 		DEBUG(1, ("ldb_del_key: %s\n", ldb_errstring(c)));
 		ret = ldb_transaction_cancel(c);
-		talloc_free(mem_ctx);
 		return WERR_FOOBAR;
 	}
 
@@ -869,12 +859,9 @@ static WERROR ldb_del_key(const struct hive_key *key, const char *name)
 	{
 		DEBUG(0, ("ldb_transaction_commit: %s\n", ldb_errstring(c)));
 		ret = ldb_transaction_cancel(c);
-		talloc_free(mem_ctx);
 		return WERR_FOOBAR;
 	}
 
-	talloc_free(mem_ctx);
-
 	/* reset cache */
 	talloc_free(parentkd->subkeys);
 	parentkd->subkeys = NULL;
diff --git a/source4/lib/registry/local.c b/source4/lib/registry/local.c
index 458239b..be48729 100644
--- a/source4/lib/registry/local.c
+++ b/source4/lib/registry/local.c
@@ -57,9 +57,11 @@ struct registry_key *reg_import_hive_key(struct registry_context *ctx,
 	parent_path.elements = elements;
 
 	local_key = talloc(ctx, struct local_key);
-	local_key->hive_key = talloc_steal(local_key, hive);
-	local_key->global.context = talloc_reference(local_key, ctx);
-	local_key->path = parent_path;
+	if (local_key != NULL) {
+		local_key->hive_key = talloc_reference(local_key, hive);
+		local_key->global.context = talloc_reference(local_key, ctx);
+		local_key->path = parent_path;
+	}
 
 	return (struct registry_key *)local_key;
 }
@@ -70,9 +72,7 @@ static WERROR local_open_key(TALLOC_CTX *mem_ctx,
 			     const char *path,
 			     struct registry_key **result)
 {
-	char *orig = talloc_strdup(mem_ctx, path),
-		 *curbegin = orig,
-		 *curend = strchr(orig, '\\');
+	char *orig, *curbegin, *curend;
 	struct local_key *local_parent = talloc_get_type(parent,
 							 struct local_key);
 	struct hive_key *curkey = local_parent->hive_key;
@@ -80,9 +80,15 @@ static WERROR local_open_key(TALLOC_CTX *mem_ctx,
 	const char **elements = NULL;
 	int el;
 
+	orig = talloc_strdup(mem_ctx, path);
+	W_ERROR_HAVE_NO_MEMORY(orig);
+	curbegin = orig;
+	curend = strchr(orig, '\\');
+
 	if (local_parent->path.elements != NULL) {
 		elements = talloc_array(mem_ctx, const char *,
 					str_list_length(local_parent->path.elements) + 1);
+		W_ERROR_HAVE_NO_MEMORY(elements);
 		for (el = 0; local_parent->path.elements[el] != NULL; el++) {
 			elements[el] = talloc_reference(elements,
 							local_parent->path.elements[el]);
@@ -97,7 +103,9 @@ static WERROR local_open_key(TALLOC_CTX *mem_ctx,
 		if (curend != NULL)
 			*curend = '\0';
 		elements = talloc_realloc(mem_ctx, elements, const char *, el+2);
+		W_ERROR_HAVE_NO_MEMORY(elements);
 		elements[el] = talloc_strdup(elements, curbegin);
+		W_ERROR_HAVE_NO_MEMORY(elements[el]);
 		el++;
 		elements[el] = NULL;
 		error = hive_get_key_by_name(mem_ctx, curkey,
@@ -169,15 +177,19 @@ static WERROR local_create_key(TALLOC_CTX *mem_ctx,
 	const char **elements;
 	unsigned int i;
 	const char *last_part;
+	char *trunc_name;
 
 	last_part = strrchr(name, '\\');
 	if (last_part == NULL) {
 		last_part = name;
 		local_parent = (struct local_key *)parent_key;
 	} else {
+		trunc_name = talloc_strndup(mem_ctx, name, last_part - name);
+		W_ERROR_HAVE_NO_MEMORY(trunc_name);
 		W_ERROR_NOT_OK_RETURN(reg_open_key(mem_ctx, parent_key,
-						   talloc_strndup(mem_ctx, name, last_part-name),
+						   trunc_name,
 						   (struct registry_key **)&local_parent));
+		talloc_free(trunc_name);
 		last_part++;
 	}
 
@@ -188,16 +200,19 @@ static WERROR local_create_key(TALLOC_CTX *mem_ctx,
 	if (local_parent->path.elements != NULL) {
 		elements = talloc_array(hivekey, const char *,
 					str_list_length(local_parent->path.elements)+2);
+		W_ERROR_HAVE_NO_MEMORY(elements);
 		for (i = 0; local_parent->path.elements[i] != NULL; i++) {
 			elements[i] = talloc_reference(elements,
 						       local_parent->path.elements[i]);
 		}
 	} else {
 		elements = talloc_array(hivekey, const char *, 2);
+		W_ERROR_HAVE_NO_MEMORY(elements);
 		i = 0;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list