[PATCHv2] fix broken list iteration in clear_child_for_cleanup
- From
David Gould <david@optimisefitness.com>
- Date
- Sep 11, 2012, 20:22 UTC
- Message-ID
- <1347394965-29906-1-git-send-email-david@optimisefitness.com>
- In-Reply-To
- <1347373967-29248-1-git-send-email-david@optimisefitness.com>
We iterate through the list of children to cleanup, but do not keep our "last" pointer up to date. As a result, we may end up cutting off part of the list instead of removing a single element.
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> --- PATCHv2 updates PATCH only in the commit message: Peff suggested both a helpful subject and a more-informative introduction.
run-command.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/run-command.c b/run-command.c index f9922b9..c42d63b 100644 --- a/run-command.c +++ b/run-command.c @@ -53,13 +53,13 @@ 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) { + if ((*pp)->pid == pid) { + struct child_to_clean *clean_me = *pp; + *pp = clean_me->next; + free(clean_me); return; } }
-- 1.7.9.5