From bebf14cc298eb41d8e5c245e3800aea69ecca08c Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Thu, 31 Aug 2017 16:50:27 -0500 Subject: Another try at fixing the ps segfault resulting from /proc entries vanishing out from under us due to asyncronous process exit. The directory we're traversing vanishing can result in DIRTREE_ABORTVAL being returned, which we turn into a NUL entry, but then we were trying to look at that null entry's children. Oops. --- toys/posix/ps.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'toys') diff --git a/toys/posix/ps.c b/toys/posix/ps.c index a0dc53f5..aef2a7f7 100644 --- a/toys/posix/ps.c +++ b/toys/posix/ps.c @@ -915,15 +915,16 @@ static int get_threads(struct dirtree *new) // Save or display if (!TT.show_process) return DIRTREE_SAVE; TT.show_process((void *)new->extra); - dt = new->child; - new->child = 0; - while (dt->child) { - new = dt->child->next; - TT.show_process((void *)dt->child->extra); - free(dt->child); - dt->child = new; + if ((dt = new->child)) { + new->child = 0; + while (dt->child) { + new = dt->child->next; + TT.show_process((void *)dt->child->extra); + free(dt->child); + dt->child = new; + } + free(dt); } - free(dt); return 0; } -- cgit v1.2.3