diff options
author | Junio C Hamano <gitster@pobox.com> | 2018-05-30 21:51:28 +0900 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2018-05-30 21:51:28 +0900 |
commit | 3f384aaac4cce1d06dbb53794f658ce8ddbf685d (patch) | |
tree | 38cb90f22efc087ab023e5cd4574583f6e625f9b | |
parent | 7c3d15fe3113cf48db60656eedd152c46f47bf6b (diff) | |
parent | e7347cb9ba350880e6ccccd6fa6a33cec04c5111 (diff) | |
download | git-3f384aaac4cce1d06dbb53794f658ce8ddbf685d.tar.gz |
Merge branch 'ma/config-store-data-clear'
Leak plugging.
* ma/config-store-data-clear:
config: let `config_store_data_clear()` handle `key`
config: let `config_store_data_clear()` handle `value_regex`
config: free resources of `struct config_store_data`
-rw-r--r-- | config.c | 36 |
1 files changed, 18 insertions, 18 deletions
@@ -2333,6 +2333,19 @@ struct config_store_data { unsigned int key_seen:1, section_seen:1, is_keys_section:1; }; +static void config_store_data_clear(struct config_store_data *store) +{ + free(store->key); + 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)); +} + static int matches(const char *key, const char *value, const struct config_store_data *store) { @@ -2667,7 +2680,6 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, fd = hold_lock_file_for_update(&lock, config_filename, 0); if (fd < 0) { error_errno("could not lock config file %s", config_filename); - free(store.key); ret = CONFIG_NO_LOCK; goto out_free; } @@ -2677,8 +2689,6 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, */ in_fd = open(config_filename, O_RDONLY); if ( in_fd < 0 ) { - free(store.key); - if ( ENOENT != errno ) { error_errno("opening %s", config_filename); ret = CONFIG_INVALID_FILE; /* same as "invalid config file" */ @@ -2690,7 +2700,8 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, goto out_free; } - store.key = (char *)key; + free(store.key); + store.key = xstrdup(key); if (write_section(fd, key, &store) < 0 || write_pair(fd, key, value, &store) < 0) goto write_err_out; @@ -2715,7 +2726,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; } @@ -2740,23 +2751,10 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, 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) || (store.seen_nr > 1 && multi_replace == 0)) { @@ -2887,6 +2885,7 @@ out_free: munmap(contents, contents_sz); if (in_fd >= 0) close(in_fd); + config_store_data_clear(&store); return ret; write_err_out: @@ -3127,6 +3126,7 @@ out: rollback_lock_file(&lock); out_no_rollback: free(filename_buf); + config_store_data_clear(&store); return ret; } |