path: root/unpack-trees.h
diff options
authorMartin Ågren <>2018-05-21 14:54:28 (GMT)
committerJunio C Hamano <>2018-05-22 02:59:31 (GMT)
commit1c41d2805e42d77d943fd3d79ebf5136f74c9ba3 (patch)
treef98278a1446ac08bfb9ada55d3cddb9da6470257 /unpack-trees.h
parent342c513a4ae100354097a9ca99a080eeb7e70c0b (diff)
unpack_trees_options: free messages when done
The strings allocated in `setup_unpack_trees_porcelain()` are never freed. Provide a function `clear_unpack_trees_porcelain()` to do so and call it where we use `setup_unpack_trees_porcelain()`. The only non-trivial user is `unpack_trees_start()`, where we should place the new call in `unpack_trees_finish()`. We keep the string pointers in an array, mixing pointers to static memory and memory that we allocate on the heap. We also keep several copies of the individual pointers. So we need to make sure that we do not free what we must not free and that we do not double-free. Let a separate argv_array take ownership of all the strings we create so that we can easily free them. Zero the whole array of string pointers to make sure that we do not leave any dangling pointers. Note that we only take responsibility for the memory allocated in `setup_unpack_trees_porcelain()` and not any other members of the `struct unpack_trees_options`. Helped-by: Junio C Hamano <> Signed-off-by: Junio C Hamano <> Signed-off-by: Martin Ågren <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'unpack-trees.h')
1 files changed, 7 insertions, 1 deletions
diff --git a/unpack-trees.h b/unpack-trees.h
index 41178ad..c2b434c 100644
--- a/unpack-trees.h
+++ b/unpack-trees.h
@@ -2,7 +2,7 @@
#include "tree-walk.h"
-#include "string-list.h"
+#include "argv-array.h"
@@ -33,6 +33,11 @@ enum unpack_trees_error_types {
void setup_unpack_trees_porcelain(struct unpack_trees_options *opts,
const char *cmd);
+ * Frees resources allocated by setup_unpack_trees_porcelain().
+ */
+void clear_unpack_trees_porcelain(struct unpack_trees_options *opts);
struct unpack_trees_options {
unsigned int reset,
@@ -57,6 +62,7 @@ struct unpack_trees_options {
struct pathspec *pathspec;
merge_fn_t fn;
const char *msgs[NB_UNPACK_TREES_ERROR_TYPES];
+ struct argv_array msgs_to_free;
* Store error messages in an array, each case
* corresponding to a error message type