git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 3/3] config: let `config_store_data_clear()` handle `key`

From
MÅMartin Ågren <martin.agren@gmail.com>
Date
May 20, 2018, 10:42 UTC
Message-ID
<e71b2abd7298de0123a6222186a8faa3fadf50c0.1526812503.git.martin.agren@gmail.com>
In-Reply-To
<cover.1526812503.git.martin.agren@gmail.com>

Instead of remembering to free `key` in each code path, let `config_store_data_clear()` handle that.

We still need to free it before replacing it, though. Move that freeing closer to the replacing to be safe. Note that in that same part of the code, we can no longer set `key` to the original pointer, but need to `xstrdup()` it.

Signed-off-by: Martin Ågren <martin.agren@gmail.com>
---
 config.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/config.c b/config.c
index ac71f3f2e1..339a92235d 100644
--- a/config.c
+++ b/config.c
@@ -2335,6 +2335,7 @@ struct config_store_data {
 
 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);
@@ -2679,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;
 	}
@@ -2689,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" */
@@ -2702,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;
@@ -2752,13 +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);
 			ret = CONFIG_INVALID_FILE;
 			goto out_free;
 		}
 
-		free(store.key);
-
 		/* if nothing to unset, or too many matches, error out */
 		if ((store.seen_nr == 0 && value == NULL) ||
 		    (store.seen_nr > 1 && multi_replace == 0)) {
-- 
2.17.0.840.g5d83f92caf
Previous: Martin ÅgrenNext: Eric Sunshine
Message 15 of 18 in “config: free resources of `struct config_store_data`”
  1. config: free resources of `struct config_store_data`Martin Ågren, May 13, 2018
  2. Eric SunshineMay 13, 2018
  3. Martin ÅgrenMay 13, 2018
  4. 2/1 config: let `config_store_data_clear()` handle `value_regex`Martin Ågren, May 13, 2018
  5. Eric SunshineMay 14, 2018
  6. regex: do not call `regfree()` if compilation failsMartin Ågren, May 20, 2018
  7. Stefan BellerMay 21, 2018
  8. Eric SunshineMay 22, 2018
  9. Martin ÅgrenMay 22, 2018
  10. 3/1 config: let `config_store_data_clear()` handle `key`Martin Ågren, May 13, 2018
  11. Eric SunshineMay 14, 2018
  12. 0/3 config: free resources of `struct config_store_data`Martin Ågren, May 20, 2018
  13. 1/3 config: free resources of `struct config_store_data`Martin Ågren, May 20, 2018
  14. 2/3 config: let `config_store_data_clear()` handle `value_regex`Martin Ågren, May 20, 2018
  15. 3/3 config: let `config_store_data_clear()` handle `key`Martin Ågren, May 20, 2018
  16. Eric SunshineMay 23, 2018
  17. Eric SunshineMay 23, 2018
  18. Martin ÅgrenMay 13, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.