[SCM] Samba Shared Repository - branch master updated

Matthias Dieter Wallnöfer mdw at samba.org
Mon Mar 22 06:35:06 MDT 2010


The branch, master has been updated
       via  686825e... s4:registry - "patchfile" - initialise the data blobs
       via  c5b9b25... s4:registry - "patchfile" - add more "talloc_free"s to save memory
       via  885a167... s4:registry - "util.c" - "reg_string_to_val" - consider always the return values
       via  6f7f16d... s4:registry - "patchfile_preg.c" - also here don't accumulate the memory usage
       via  93472b4... s4:registry - "patchfile_dotreg.c" - fix a memory leak
       via  5f24bfb... s4:registry - "patchfile" - add comments
      from  b2f45f2... s3: Add "log writeable files on exit" parameter

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


- Log -----------------------------------------------------------------
commit 686825e0255a106d7bc67fb6059cd3c1ddefe315
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 13:33:04 2010 +0100

    s4:registry - "patchfile" - initialise the data blobs

commit c5b9b25c714516555bb6832edb62a72b66268dd8
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 12:42:21 2010 +0100

    s4:registry - "patchfile" - add more "talloc_free"s to save memory

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

    s4:registry - "util.c" - "reg_string_to_val" - consider always the return values
    
    In some cases we didn't consider them.

commit 6f7f16dc80000ccea582036dc58ce81ea9f078b0
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 12:15:19 2010 +0100

    s4:registry - "patchfile_preg.c" - also here don't accumulate the memory usage
    
    Free always the unused stuff.

commit 93472b41dedd8e30be8752c271f2b4bca392176a
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 12:00:57 2010 +0100

    s4:registry - "patchfile_dotreg.c" - fix a memory leak
    
    Here we allocate memory on the "NULL" context through "reg_val_data_string" on
    each call of "set_value". So when we have written out the allocated data on the
    specified file descriptor we should immediately free this memory! Otherwise we
    may end up with a big memory consumption on big registry databases.

commit 5f24bfb7b9419d4aac220adc038bd3776fc172e6
Author: Matthias Dieter Wallnöfer <mwallnoefer at yahoo.de>
Date:   Mon Mar 22 11:45:20 2010 +0100

    s4:registry - "patchfile" - add comments
    
    Helps to understand when we need to generate the hive diffs.

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

Summary of changes:
 source4/lib/registry/patchfile.c        |   45 ++++++++++++++++++++++++++-----
 source4/lib/registry/patchfile_dotreg.c |    8 +++--
 source4/lib/registry/patchfile_preg.c   |   30 ++++++++++++++++++---
 source4/lib/registry/util.c             |   16 ++++++-----
 4 files changed, 78 insertions(+), 21 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/lib/registry/patchfile.c b/source4/lib/registry/patchfile.c
index 6b08cf8..9a4c9a6 100644
--- a/source4/lib/registry/patchfile.c
+++ b/source4/lib/registry/patchfile.c
@@ -4,7 +4,7 @@
 
    Copyright (C) Jelmer Vernooij 2004-2007
    Copyright (C) Wilco Baan Hofman 2006
-   Copyright (C) Matthias Dieter Wallnöfer 2008
+   Copyright (C) Matthias Dieter Wallnöfer 2008-2010
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -175,7 +175,7 @@ WERROR reg_generate_diff_key(struct registry_key *oldkey,
 	for(i = 0; i < new_num_values; i++) {
 		const char *name;
 		uint32_t type1, type2;
-		DATA_BLOB contents1, contents2;
+		DATA_BLOB contents1 = { NULL, 0 }, contents2 = { NULL, 0 };
 
 		error1 = reg_key_get_value_by_index(mem_ctx, newkey, i,
 						    &name, &type1, &contents1);
@@ -202,19 +202,27 @@ WERROR reg_generate_diff_key(struct registry_key *oldkey,
 		}
 
 		if (W_ERROR_IS_OK(error2)
-			&& (data_blob_cmp(&contents1, &contents2) == 0)
-			&& (type1 == type2))
+		    && (data_blob_cmp(&contents1, &contents2) == 0)
+		    && (type1 == type2)) {
+			talloc_free(discard_const_p(char, name));
+			talloc_free(contents1.data);
+			talloc_free(contents2.data);
 			continue;
+		}
 
 		callbacks->set_value(callback_data, path, name,
 				     type1, contents1);
+
+		talloc_free(discard_const_p(char, name));
+		talloc_free(contents1.data);
+		talloc_free(contents2.data);
 	}
 
 	/* Values that were deleted */
 	for (i = 0; i < old_num_values; i++) {
 		const char *name;
 		uint32_t type;
-		DATA_BLOB contents;
+		DATA_BLOB contents = { NULL, 0 };
 
 		error1 = reg_key_get_value_by_index(mem_ctx, oldkey, i, &name,
 						    &type, &contents);
@@ -231,8 +239,11 @@ WERROR reg_generate_diff_key(struct registry_key *oldkey,
 		else
 			error2 = WERR_BADFILE;
 
-		if (W_ERROR_IS_OK(error2))
+		if (W_ERROR_IS_OK(error2)) {
+			talloc_free(discard_const_p(char, name));
+			talloc_free(contents.data);
 			continue;
+		}
 
 		if (!W_ERROR_EQUAL(error2, WERR_BADFILE)) {
 			DEBUG(0, ("Error occurred while getting value by name: %s\n",
@@ -242,6 +253,9 @@ WERROR reg_generate_diff_key(struct registry_key *oldkey,
 		}
 
 		callbacks->del_value(callback_data, path, name);
+
+		talloc_free(discard_const_p(char, name));
+		talloc_free(contents.data);
 	}
 
 	talloc_free(mem_ctx);
@@ -280,10 +294,16 @@ _PUBLIC_ WERROR reg_generate_diff(struct registry_context *ctx1,
 			continue;
 		}
 
+		/* if "r1" is NULL (old hive) and "r2" isn't (new hive) then
+		 * the hive doesn't exist yet and we have to generate an add
+		 * diff */
 		if ((r1 == NULL) && (r2 != NULL)) {
 			callbacks->add_key(callback_data,
 					   reg_predefined_keys[i].name);
 		}
+		/* if "r1" isn't NULL (old hive) and "r2" is (new hive) then
+		 * the hive shouldn't exist anymore and we have to generate a
+		 * del diff */
 		if ((r1 != NULL) && (r2 == NULL)) {
 			callbacks->del_key(callback_data,
 					   reg_predefined_keys[i].name);
@@ -375,9 +395,12 @@ static WERROR reg_diff_apply_add_key(void *_ctx, const char *key_name)
 				return error;
 			}
 			*buf_ptr++ = '\\';
+			talloc_free(tmp);
 		}
 	}
 
+	talloc_free(buf);
+
 	/* Add the key */
 	error = reg_key_add_abs(ctx, ctx, key_name, 0, NULL, &tmp);
 
@@ -387,6 +410,8 @@ static WERROR reg_diff_apply_add_key(void *_ctx, const char *key_name)
 			key_name, win_errstr(error)));
 		return error;
 	}
+	talloc_free(tmp);
+
 	return WERR_OK;
 }
 
@@ -428,6 +453,8 @@ static WERROR reg_diff_apply_set_value(void *_ctx, const char *path,
 		return error;
 	}
 
+	talloc_free(tmp);
+
 	return WERR_OK;
 }
 
@@ -452,6 +479,7 @@ static WERROR reg_diff_apply_del_value(void *_ctx, const char *key_name,
 		return error;
 	}
 
+	talloc_free(tmp);
 
 	return WERR_OK;
 }
@@ -461,7 +489,7 @@ static WERROR reg_diff_apply_del_all_values(void *_ctx, const char *key_name)
 	struct registry_context *ctx = (struct registry_context *)_ctx;
 	struct registry_key *key;
 	WERROR error;
-	const char* value_name;
+	const char *value_name;
 
 	error = reg_open_key_abs(ctx, ctx, key_name, &key);
 
@@ -480,8 +508,11 @@ static WERROR reg_diff_apply_del_all_values(void *_ctx, const char *key_name)
 			DEBUG(0, ("Error deleting value '%s'\n", value_name));
 			return error;
 		}
+		talloc_free(discard_const_p(char, value_name));
 	}
 
+	talloc_free(key);
+
 	return WERR_OK;
 }
 
diff --git a/source4/lib/registry/patchfile_dotreg.c b/source4/lib/registry/patchfile_dotreg.c
index 3b57089..12f2f70 100644
--- a/source4/lib/registry/patchfile_dotreg.c
+++ b/source4/lib/registry/patchfile_dotreg.c
@@ -61,10 +61,12 @@ static WERROR reg_dotreg_diff_set_value(void *_data, const char *path,
 					uint32_t value_type, DATA_BLOB value)
 {
 	struct dotreg_data *data = (struct dotreg_data *)_data;
-
+	char *data_string = reg_val_data_string(NULL, data->iconv_convenience,
+						value_type, value);
+	W_ERROR_HAVE_NO_MEMORY(data_string);
 	fdprintf(data->fd, "\"%s\"=%s:%s\n",
-			value_name, str_regtype(value_type),
-			reg_val_data_string(NULL, data->iconv_convenience, value_type, value));
+		 value_name, str_regtype(value_type), data_string);
+	talloc_free(data_string);
 
 	return WERR_OK;
 }
diff --git a/source4/lib/registry/patchfile_preg.c b/source4/lib/registry/patchfile_preg.c
index d7b4bc3..c75b08d 100644
--- a/source4/lib/registry/patchfile_preg.c
+++ b/source4/lib/registry/patchfile_preg.c
@@ -88,15 +88,23 @@ static WERROR reg_preg_diff_del_key(void *_data, const char *key_name)
 	struct preg_data *data = (struct preg_data *)_data;
 	char *parent_name;
 	DATA_BLOB blob;
+	WERROR werr;
 
 	parent_name = talloc_strndup(data->ctx, key_name, strrchr(key_name, '\\')-key_name);
+	W_ERROR_HAVE_NO_MEMORY(parent_name);
 	blob.data = (uint8_t *)talloc_strndup(data->ctx, key_name+(strrchr(key_name, '\\')-key_name)+1,
 			strlen(key_name)-(strrchr(key_name, '\\')-key_name));
+	W_ERROR_HAVE_NO_MEMORY(blob.data);
 	blob.length = strlen((char *)blob.data)+1;
 	
 
 	/* FIXME: These values should be accumulated to be written at done(). */
-	return reg_preg_diff_set_value(data, parent_name, "**DeleteKeys", REG_SZ, blob);
+	werr = reg_preg_diff_set_value(data, parent_name, "**DeleteKeys", REG_SZ, blob);
+
+	talloc_free(parent_name);
+	talloc_free(blob.data);
+
+	return werr;
 }
 
 static WERROR reg_preg_diff_del_value(void *_data, const char *key_name,
@@ -105,25 +113,39 @@ static WERROR reg_preg_diff_del_value(void *_data, const char *key_name,
 	struct preg_data *data = (struct preg_data *)_data;
 	char *val;
 	DATA_BLOB blob;
+	WERROR werr;
 
 	val = talloc_asprintf(data->ctx, "**Del.%s", value_name);
-
+	W_ERROR_HAVE_NO_MEMORY(val);
 	blob.data = (uint8_t *)talloc(data->ctx, uint32_t);
+	W_ERROR_HAVE_NO_MEMORY(blob.data);
 	SIVAL(blob.data, 0, 0);
 	blob.length = 4;
-	return reg_preg_diff_set_value(data, key_name, val, REG_DWORD, blob);
+
+	werr = reg_preg_diff_set_value(data, key_name, val, REG_DWORD, blob);
+
+	talloc_free(val);
+	talloc_free(blob.data);
+
+	return werr;
 }
 
 static WERROR reg_preg_diff_del_all_values(void *_data, const char *key_name)
 {
 	struct preg_data *data = (struct preg_data *)_data;
 	DATA_BLOB blob;
+	WERROR werr;
 
 	blob.data = (uint8_t *)talloc(data->ctx, uint32_t);
+	W_ERROR_HAVE_NO_MEMORY(blob.data);
 	SIVAL(blob.data, 0, 0);
 	blob.length = 4;
 
-	return reg_preg_diff_set_value(data, key_name, "**DelVals.", REG_DWORD, blob);
+	werr = reg_preg_diff_set_value(data, key_name, "**DelVals.", REG_DWORD, blob);
+
+	talloc_free(blob.data);
+
+	return werr;
 }
 
 static WERROR reg_preg_diff_done(void *_data)
diff --git a/source4/lib/registry/util.c b/source4/lib/registry/util.c
index 3c12899..b389ea4 100644
--- a/source4/lib/registry/util.c
+++ b/source4/lib/registry/util.c
@@ -146,24 +146,26 @@ _PUBLIC_ bool reg_string_to_val(TALLOC_CTX *mem_ctx,
 			break;
 		case REG_SZ:
 		case REG_EXPAND_SZ:
-			convert_string_talloc_convenience(mem_ctx,
-							  iconv_convenience,
-							  CH_UNIX, CH_UTF16,
-							  data_str,
-							  strlen(data_str)+1,
-							  (void **)&data->data,
-							  &data->length, false);
+			return convert_string_talloc_convenience(mem_ctx,
+								 iconv_convenience,
+								 CH_UNIX, CH_UTF16,
+								 data_str,
+								 strlen(data_str)+1,
+								 (void **)&data->data,
+								 &data->length, false);
 			break;
 		case REG_DWORD:
 		case REG_DWORD_BIG_ENDIAN: {
 			uint32_t tmp = strtol(data_str, NULL, 0);
 			*data = data_blob_talloc(mem_ctx, NULL, sizeof(uint32_t));
+			if (data->data == NULL) return false;
 			SIVAL(data->data, 0, tmp);
 			}
 			break;
 		case REG_QWORD: {
 			uint64_t tmp = strtoll(data_str, NULL, 0);
 			*data = data_blob_talloc(mem_ctx, NULL, sizeof(uint64_t));
+			if (data->data == NULL) return false;
 			SBVAL(data->data, 0, tmp);
 			}
 			break;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list