From 1a9a71f47c2471cf48a7d059d3d447f5dd1c14cd Mon Sep 17 00:00:00 2001 From: Yoshinori Sugino Date: Fri, 4 Dec 2020 15:12:06 +0900 Subject: [PATCH] sched/sched/sched_waitid.c: Fix an error that occurs when a waiting task has already finished Summary: - Fix an error that occurs when a waiting task has already finished. Impact: - waitid Testing: hifive1-revb:nsh (CONFIG_SCHED_HAVE_PARENT=y, CONFIG_SCHED_CHILD_STATUS=y, CONFIG_SIG_DEFAULT=y) on QEMU static int task_main(int argc, char *argv[]) { return 0; } int main(int argc, FAR char *argv[]) { siginfo_t info; int pid; int ret; pid = task_create("task", 224, 1024, task_main, NULL); sleep(1); ret = waitid(P_PID, pid, &info, WEXITED); assert(ret == 0); return 0; } --- sched/sched/sched_waitid.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/sched/sched/sched_waitid.c b/sched/sched/sched_waitid.c index 20019342af1..8aac1122dc8 100644 --- a/sched/sched/sched_waitid.c +++ b/sched/sched/sched_waitid.c @@ -178,15 +178,17 @@ int nx_waitid(int idtype, id_t id, FAR siginfo_t *info, int options) */ ctcb = nxsched_get_tcb((pid_t)id); - -#ifdef HAVE_GROUP_MEMBERS - if (ctcb == NULL || ctcb->group->tg_pgrpid != rtcb->group->tg_grpid) -#else - if (ctcb == NULL || ctcb->group->tg_ppid != rtcb->pid) -#endif + if (ctcb != NULL) { - ret = -ECHILD; - goto errout; +#ifdef HAVE_GROUP_MEMBERS + if (ctcb->group->tg_pgrpid != rtcb->group->tg_grpid) +#else + if (ctcb->group->tg_ppid != rtcb->pid) +#endif + { + ret = -ECHILD; + goto errout; + } } /* Does this task retain child status? */