diff --git a/criu/include/pstree.h b/criu/include/pstree.h index 4035c6bbb..313d85666 100644 --- a/criu/include/pstree.h +++ b/criu/include/pstree.h @@ -85,6 +85,7 @@ static inline bool task_alive(struct pstree_item *i) return is_alive_state(i->pid->state); } +extern void free_pstree_item(struct pstree_item *item); extern void free_pstree(struct pstree_item *root_item); extern struct pstree_item *__alloc_pstree_item(bool rst, int level); #define alloc_pstree_item() __alloc_pstree_item(false, 1) diff --git a/criu/pstree.c b/criu/pstree.c index ca11652b3..58ee42742 100644 --- a/criu/pstree.c +++ b/criu/pstree.c @@ -176,6 +176,16 @@ void pstree_free_cores(struct pstree_item *item) } } +void free_pstree_item(struct pstree_item *item) +{ + pstree_free_cores(item); + xfree(item->threads); + xfree(item->pid); + xfree(item->pgid); + xfree(item->sid); + xfree(item); +} + void free_pstree(struct pstree_item *root_item) { struct pstree_item *item = root_item, *parent; @@ -188,10 +198,7 @@ void free_pstree(struct pstree_item *root_item) parent = item->parent; list_del(&item->sibling); - pstree_free_cores(item); - xfree(item->threads); - xfree(item->pid); - xfree(item); + free_pstree_item(item); item = parent; } } @@ -211,10 +218,7 @@ struct pstree_item *__alloc_pstree_item(bool rst, int level) item->pgid = xmalloc(p_sz); item->sid = xmalloc(p_sz); if (!item->pid || !item->pgid || !item->sid) { - xfree(item->pid); - xfree(item->pgid); - xfree(item->sid); - xfree(item); + free_pstree_item(item); return NULL; } } else { diff --git a/criu/seize.c b/criu/seize.c index d403c6c9e..748d2f610 100644 --- a/criu/seize.c +++ b/criu/seize.c @@ -500,7 +500,7 @@ static int collect_children(struct pstree_item *item) * really wrong. */ ret = 0; - xfree(c); + free_pstree_item(c); xfree(creds); continue; }