Skip to content

Commit 2a00e59

Browse files
Martin Ågrengitster
authored andcommitted
config: free resources of struct config_store_data
Commit fee8572 (config: avoid using the global variable `store`, 2018-04-09) dropped the staticness of a certain struct, instead letting the users create an instance on the stack and pass around a pointer. We do not free all the memory that the struct tracks. When the struct was static, the memory would always be reachable. Now that we keep the struct on the stack, though, as soon as we return, it goes out of scope and we leak the memory it points to. In particular, we leak the memory pointed to by the `parsed` and `seen` fields. Introduce and use a helper function `config_store_data_clear()` to plug these leaks. The memory tracked here is config parser events. Once the users (`git_config_set_multivar_in_file_gently()` and `git_config_copy_or_rename_section_in_file()` at the moment) are done, no-one should be holding on to a pointer into this memory. There are two more members of the struct that are candidates for freeing in this new function (`key` and `value_regex`). Those are actually already being taken care of. The next couple of patches will move their freeing into the function we are adding here. Signed-off-by: Martin Ågren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent ccdcbd5 commit 2a00e59

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

config.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2333,6 +2333,13 @@ struct config_store_data {
23332333
unsigned int key_seen:1, section_seen:1, is_keys_section:1;
23342334
};
23352335

2336+
static void config_store_data_clear(struct config_store_data *store)
2337+
{
2338+
free(store->parsed);
2339+
free(store->seen);
2340+
memset(store, 0, sizeof(*store));
2341+
}
2342+
23362343
static int matches(const char *key, const char *value,
23372344
const struct config_store_data *store)
23382345
{
@@ -2887,6 +2894,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
28872894
munmap(contents, contents_sz);
28882895
if (in_fd >= 0)
28892896
close(in_fd);
2897+
config_store_data_clear(&store);
28902898
return ret;
28912899

28922900
write_err_out:
@@ -3127,6 +3135,7 @@ static int git_config_copy_or_rename_section_in_file(const char *config_filename
31273135
rollback_lock_file(&lock);
31283136
out_no_rollback:
31293137
free(filename_buf);
3138+
config_store_data_clear(&store);
31303139
return ret;
31313140
}
31323141

0 commit comments

Comments
 (0)