summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>2010-03-22 12:42:21 +0100
committerMatthias Dieter Wallnöfer <mwallnoefer@yahoo.de>2010-03-22 13:23:20 +0100
commitc5b9b25c714516555bb6832edb62a72b66268dd8 (patch)
treee7daea62ffb568095ad38b35c072ccb4b1f04977
parent885a167929c7f5409a6239705ef6142ecc014ff3 (diff)
downloadsamba-c5b9b25c714516555bb6832edb62a72b66268dd8.tar.gz
samba-c5b9b25c714516555bb6832edb62a72b66268dd8.tar.bz2
samba-c5b9b25c714516555bb6832edb62a72b66268dd8.zip
s4:registry - "patchfile" - add more "talloc_free"s to save memory
-rw-r--r--source4/lib/registry/patchfile.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/source4/lib/registry/patchfile.c b/source4/lib/registry/patchfile.c
index 0da722bb6d..f0c69274fd 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
@@ -202,12 +202,20 @@ 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 */
@@ -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);
@@ -381,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);
@@ -393,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;
}
@@ -434,6 +453,8 @@ static WERROR reg_diff_apply_set_value(void *_ctx, const char *path,
return error;
}
+ talloc_free(tmp);
+
return WERR_OK;
}
@@ -458,6 +479,7 @@ static WERROR reg_diff_apply_del_value(void *_ctx, const char *key_name,
return error;
}
+ talloc_free(tmp);
return WERR_OK;
}
@@ -467,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);
@@ -486,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;
}