diff options
author | Martin Ågren <martin.agren@gmail.com> | 2018-05-20 12:42:34 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-05-21 13:57:56 +0900 |
commit | 3b82542dff46339a585c7dde3a40bc543f6212f8 (patch) | |
tree | 5aa5450dbd4c17486917f30436769b9eea4ffbf1 | |
parent | config: free resources of `struct config_store_data` (diff) | |
download | tgif-3b82542dff46339a585c7dde3a40bc543f6212f8.tar.xz |
config: let `config_store_data_clear()` handle `value_regex`
Instead of duplicating the logic for clearing up `value_regex`, let
`config_store_data_clear()` handle that.
When `regcomp()` fails, the current code does not call `regfree()`. Make
sure we do the same by immediately invalidating `value_regex`. Some
implementations are able to handle such an extra `regfree()`-call [1],
but from the example in [2], we should not do so. (The language itself
in [2] is not super-clear on this.)
[1] https://www.redhat.com/archives/libvir-list/2013-September/msg00262.html
[2] http://pubs.opengroup.org/onlinepubs/9699919799/functions/regcomp.html
Researched-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | config.c | 17 |
1 files changed, 6 insertions, 11 deletions
@@ -2335,6 +2335,11 @@ struct config_store_data { static void config_store_data_clear(struct config_store_data *store) { + if (store->value_regex != NULL && + store->value_regex != CONFIG_REGEX_NONE) { + regfree(store->value_regex); + free(store->value_regex); + } free(store->parsed); free(store->seen); memset(store, 0, sizeof(*store)); @@ -2722,7 +2727,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, if (regcomp(store.value_regex, value_regex, REG_EXTENDED)) { error("invalid pattern: %s", value_regex); - free(store.value_regex); + FREE_AND_NULL(store.value_regex); ret = CONFIG_INVALID_PATTERN; goto out_free; } @@ -2748,21 +2753,11 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, &store, &opts)) { error("invalid config file %s", config_filename); free(store.key); - if (store.value_regex != NULL && - store.value_regex != CONFIG_REGEX_NONE) { - regfree(store.value_regex); - free(store.value_regex); - } ret = CONFIG_INVALID_FILE; goto out_free; } free(store.key); - if (store.value_regex != NULL && - store.value_regex != CONFIG_REGEX_NONE) { - regfree(store.value_regex); - free(store.value_regex); - } /* if nothing to unset, or too many matches, error out */ if ((store.seen_nr == 0 && value == NULL) || |