Browse Source

run-command.c: fix broken list iteration in clear_child_for_cleanup

Iterate through children_to_clean using 'next' fields but with an
extra level of indirection. This allows us to update the chain when
we remove a child and saves us managing several variables around
the loop mechanism.

Signed-off-by: David Gould <david@optimisefitness.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
David Gould 13 years ago committed by Junio C Hamano
parent
commit
bdee397d7c
  1. 13
      run-command.c

13
run-command.c

@ -49,13 +49,14 @@ static void mark_child_for_cleanup(pid_t pid) @@ -49,13 +49,14 @@ static void mark_child_for_cleanup(pid_t pid)

static void clear_child_for_cleanup(pid_t pid)
{
struct child_to_clean **last, *p;
struct child_to_clean **pp;

last = &children_to_clean;
for (p = children_to_clean; p; p = p->next) {
if (p->pid == pid) {
*last = p->next;
free(p);
for (pp = &children_to_clean; *pp; pp = &(*pp)->next) {
struct child_to_clean *clean_me = *pp;

if (clean_me->pid == pid) {
*pp = clean_me->next;
free(clean_me);
return;
}
}

Loading…
Cancel
Save