mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
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:
parent
7f145b54af
commit
be820f41a3
3
changes/bug19466
Normal file
3
changes/bug19466
Normal 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.
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user