config: free resources of `struct config_store_data`

Commit fee8572c6d (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 <martin.agren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Martin Ågren committed May 20, 2018 at 12:42 UTC 2a00e594e5c589d05da250eb622273977eb06ad0
1 file changed +9
config.c
+9
@@ -2333,6 +2333,13 @@ struct config_store_data {
2333 unsigned int key_seen:1, section_seen:1, is_keys_section:1;
2334 };
2335
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 +
2343 static int matches(const char *key, const char *value,
2344 const struct config_store_data *store)
2345 {
@@ -2887,6 +2894,7 @@ out_free:
2894 munmap(contents, contents_sz);
2895 if (in_fd >= 0)
2896 close(in_fd);
2897 + config_store_data_clear(&store);
2898 return ret;
2899
2900 write_err_out:
@@ -3127,6 +3135,7 @@ out:
3135 rollback_lock_file(&lock);
3136 out_no_rollback:
3137 free(filename_buf);
3138 + config_store_data_clear(&store);
3139 return ret;
3140 }
3141