return extend_section(this, parent, section, merge);
}
-METHOD(settings_t, destroy, void,
- private_settings_t *this)
+CALLBACK(clear_content, void,
+ char *str, int idx, void *clear)
+{
+ if (*(bool*)clear)
+ {
+ memwipe(str, strlen(str));
+ }
+ free(str);
+}
+
+/**
+ * Destroy the settings object and optionally clear content memory
+ */
+static void destroy_settings(private_settings_t *this, bool clear)
{
- settings_section_destroy(this->top, NULL);
- array_destroy_function(this->contents, (void*)free, NULL);
+ settings_section_destroy(this->top, clear ? this->contents : NULL);
+ array_destroy_function(this->contents, clear_content, &clear);
this->lock->destroy(this->lock);
free(this);
}
+METHOD(settings_t, destroy, void,
+ private_settings_t *this)
+{
+ destroy_settings(this, FALSE);
+}
+
+METHOD(settings_t, destroy_clear, void,
+ private_settings_t *this)
+{
+ destroy_settings(this, TRUE);
+}
+
static private_settings_t *settings_create_base()
{
private_settings_t *this;
.load_string = _load_string,
.load_string_section = _load_string_section,
.destroy = _destroy,
+ .destroy_clear = _destroy_clear,
},
.top = settings_section_create(NULL),
.contents = array_create(0, 0),
}
END_TEST
+START_TEST(test_destroy_clear)
+{
+ /* just the most basic test as we can't reliably verify it works */
+ settings->destroy_clear(settings);
+}
+END_TEST
+
START_SETUP(setup_bool_config)
{
create_settings(chunk_from_str(
}
END_TEST
-
START_TEST(test_load_string)
{
char *content =
tcase_add_test(tc, test_set_default_str);
suite_add_tcase(s, tc);
+ tc = tcase_create("destroy_clear");
+ tcase_add_checked_fixture(tc, setup_base_config, NULL);
+ tcase_add_test(tc, test_destroy_clear);
+ suite_add_tcase(s, tc);
+
tc = tcase_create("get/set_bool");
tcase_add_checked_fixture(tc, setup_bool_config, teardown_config);
tcase_add_test(tc, test_get_bool);