summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>2010-03-22 12:15:19 +0100
committerMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>2010-03-22 12:26:40 +0100
commit6f7f16dc80000ccea582036dc58ce81ea9f078b0 (patch)
tree05ea4eca1c16e2fc7923ca0cb8963dec8078c76f
parent93472b41dedd8e30be8752c271f2b4bca392176a (diff)
downloadsamba-6f7f16dc80000ccea582036dc58ce81ea9f078b0.tar.gz
samba-6f7f16dc80000ccea582036dc58ce81ea9f078b0.tar.bz2
samba-6f7f16dc80000ccea582036dc58ce81ea9f078b0.zip
s4:registry - "patchfile_preg.c" - also here don't accumulate the memory usage
Free always the unused stuff.
-rw-r--r--source4/lib/registry/patchfile_preg.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/source4/lib/registry/patchfile_preg.c b/source4/lib/registry/patchfile_preg.c
index d7b4bc3730..c75b08dbe1 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)