Skip to content

Commit 71e11fb

Browse files
committed
sub-process: avoid leaking cmd
In some instances (particularly the `read_object` hook), the `cmd` attribute is set to an `strdup()`ed value. This value needs to be released in the end! Since other users assign a non-`strdup()`ed value, be careful to add _another_ attribute (called `to_free`) that can hold a reference to such a string that needs to be released once the sub process is done. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent 6eb3258 commit 71e11fb

File tree

2 files changed

+14
-1
lines changed

2 files changed

+14
-1
lines changed

sub-process.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ void subprocess_stop(struct hashmap *hashmap, struct subprocess_entry *entry)
6363
finish_command(&entry->process);
6464

6565
hashmap_remove(hashmap, &entry->ent, NULL);
66+
FREE_AND_NULL(entry->to_free);
67+
entry->cmd = NULL;
6668
}
6769

6870
static void subprocess_exit_handler(struct child_process *process)
@@ -100,6 +102,7 @@ int subprocess_start(struct hashmap *hashmap, struct subprocess_entry *entry, co
100102
process->trace2_child_class = "subprocess";
101103

102104
entry->cmd = process->args.v[0];
105+
entry->to_free = NULL;
103106

104107
err = start_command(process);
105108
if (err) {
@@ -145,11 +148,13 @@ int subprocess_start_strvec(struct hashmap *hashmap,
145148
process->trace2_child_class = "subprocess";
146149

147150
sq_quote_argv_pretty(&quoted, argv->v);
148-
entry->cmd = strbuf_detach(&quoted, NULL);
151+
entry->cmd = entry->to_free = strbuf_detach(&quoted, NULL);
149152

150153
err = start_command(process);
151154
if (err) {
152155
error("cannot fork to run subprocess '%s'", entry->cmd);
156+
FREE_AND_NULL(entry->to_free);
157+
entry->cmd = NULL;
153158
return err;
154159
}
155160

@@ -158,6 +163,8 @@ int subprocess_start_strvec(struct hashmap *hashmap,
158163
err = startfn(entry);
159164
if (err) {
160165
error("initialization for subprocess '%s' failed", entry->cmd);
166+
FREE_AND_NULL(entry->to_free);
167+
entry->cmd = NULL;
161168
subprocess_stop(hashmap, entry);
162169
return err;
163170
}

sub-process.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
struct subprocess_entry {
2626
struct hashmap_entry ent;
2727
const char *cmd;
28+
/**
29+
* In case `cmd` is a `strdup()`ed value that needs to be released,
30+
* you can assign the pointer to `to_free` so that `subprocess_stop()`
31+
* will release it.
32+
*/
33+
char *to_free;
2834
struct child_process process;
2935
};
3036

0 commit comments

Comments
 (0)