From be820f41a33413883b23220ec19135477ac3e67d Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Fri, 12 Aug 2016 18:47:35 -0400 Subject: [PATCH] Fix quite a few slow memory leaks in config.c This bug was introduced in 8bbbbaf87b5ab3c when we added a separate or_options_free() function but didn't start using it everywhere. Fixes bug 19466. --- changes/bug19466 | 3 +++ src/or/config.c | 20 ++++++++++---------- 2 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 changes/bug19466 diff --git a/changes/bug19466 b/changes/bug19466 new file mode 100644 index 0000000000..d0c2ada579 --- /dev/null +++ b/changes/bug19466 @@ -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. diff --git a/src/or/config.c b/src/or/config.c index 3fab3b3ec8..06ce161f6b 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -746,7 +746,7 @@ set_options(or_options_t *new_val, char **msg) } if (old_options != global_options) - config_free(&options_format, old_options); + or_options_free(old_options); return 0; } @@ -2143,23 +2143,23 @@ options_trial_assign(config_line_t *list, int use_defaults, if ((r=config_assign(&options_format, trial_options, list, use_defaults, clear_first, msg)) < 0) { - config_free(&options_format, trial_options); + or_options_free(trial_options); return r; } if (options_validate(get_options_mutable(), trial_options, 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. */ } 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; } if (set_options(trial_options, msg)<0) { - config_free(&options_format, trial_options); + or_options_free(trial_options); 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. */ - config_free(&options_format, newoptions); - config_free(&options_format, newdefaultoptions); + or_options_free(newoptions); + or_options_free(newdefaultoptions); newdefaultoptions = NULL; newoptions = tor_malloc_zero(sizeof(or_options_t)); newoptions->magic_ = OR_OPTIONS_MAGIC; @@ -4927,14 +4927,14 @@ options_init_from_string(const char *cf_defaults, const char *cf, err = SETOPT_ERR_SETTING; goto err; /* frees and replaces old options */ } - config_free(&options_format, global_default_options); + or_options_free(global_default_options); global_default_options = newdefaultoptions; return SETOPT_OK; err: - config_free(&options_format, newoptions); - config_free(&options_format, newdefaultoptions); + or_options_free(newoptions); + or_options_free(newdefaultoptions); if (*msg) { char *old_msg = *msg; tor_asprintf(msg, "Failed to parse/validate config: %s", old_msg);