Fix quite a few slow memory leaks in config.c

This bug was introduced in 8bbbbaf87b when we added a separate
or_options_free() function but didn't start using it everywhere.

Fixes bug 19466.
This commit is contained in:
Nick Mathewson 2016-08-12 18:47:35 -04:00
parent 7f145b54af
commit be820f41a3
2 changed files with 13 additions and 10 deletions

3
changes/bug19466 Normal file
View File

@ -0,0 +1,3 @@
o Minor bugfixes (memory leak):
- Fix a series of slow memory leaks related to parsing torrc files
and options. Fixes bug 19466; bugfix on 0.2.1.6-alpha.

View File

@ -746,7 +746,7 @@ set_options(or_options_t *new_val, char **msg)
} }
if (old_options != global_options) if (old_options != global_options)
config_free(&options_format, old_options); or_options_free(old_options);
return 0; return 0;
} }
@ -2143,23 +2143,23 @@ options_trial_assign(config_line_t *list, int use_defaults,
if ((r=config_assign(&options_format, trial_options, if ((r=config_assign(&options_format, trial_options,
list, use_defaults, clear_first, msg)) < 0) { list, use_defaults, clear_first, msg)) < 0) {
config_free(&options_format, trial_options); or_options_free(trial_options);
return r; return r;
} }
if (options_validate(get_options_mutable(), trial_options, if (options_validate(get_options_mutable(), trial_options,
global_default_options, 1, msg) < 0) { global_default_options, 1, msg) < 0) {
config_free(&options_format, trial_options); or_options_free(trial_options);
return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */ return SETOPT_ERR_PARSE; /*XXX make this a separate return value. */
} }
if (options_transition_allowed(get_options(), trial_options, msg) < 0) { if (options_transition_allowed(get_options(), trial_options, msg) < 0) {
config_free(&options_format, trial_options); or_options_free(trial_options);
return SETOPT_ERR_TRANSITION; return SETOPT_ERR_TRANSITION;
} }
if (set_options(trial_options, msg)<0) { if (set_options(trial_options, msg)<0) {
config_free(&options_format, trial_options); or_options_free(trial_options);
return SETOPT_ERR_SETTING; return SETOPT_ERR_SETTING;
} }
@ -4873,8 +4873,8 @@ options_init_from_string(const char *cf_defaults, const char *cf,
} }
/* Clear newoptions and re-initialize them with new defaults. */ /* Clear newoptions and re-initialize them with new defaults. */
config_free(&options_format, newoptions); or_options_free(newoptions);
config_free(&options_format, newdefaultoptions); or_options_free(newdefaultoptions);
newdefaultoptions = NULL; newdefaultoptions = NULL;
newoptions = tor_malloc_zero(sizeof(or_options_t)); newoptions = tor_malloc_zero(sizeof(or_options_t));
newoptions->magic_ = OR_OPTIONS_MAGIC; newoptions->magic_ = OR_OPTIONS_MAGIC;
@ -4927,14 +4927,14 @@ options_init_from_string(const char *cf_defaults, const char *cf,
err = SETOPT_ERR_SETTING; err = SETOPT_ERR_SETTING;
goto err; /* frees and replaces old options */ goto err; /* frees and replaces old options */
} }
config_free(&options_format, global_default_options); or_options_free(global_default_options);
global_default_options = newdefaultoptions; global_default_options = newdefaultoptions;
return SETOPT_OK; return SETOPT_OK;
err: err:
config_free(&options_format, newoptions); or_options_free(newoptions);
config_free(&options_format, newdefaultoptions); or_options_free(newdefaultoptions);
if (*msg) { if (*msg) {
char *old_msg = *msg; char *old_msg = *msg;
tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg); tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg);