From ff6ba02378733f922daeec8020f6e28fd52cac09 Mon Sep 17 00:00:00 2001 From: zhangyuan21 Date: Fri, 5 May 2023 00:38:41 +0800 Subject: [PATCH] sched/pthread: return ESRCH when thread not found at pthread_detach https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_detach.html If an implementation detects that the value specified by the thread argument to pthread_detach() does not refer to a joinable thread, it is recommended that the function should fail and report an [EINVAL] error. If an implementation detects use of a thread ID after the end of its lifetime, it is recommended that the function should fail and report an [ESRCH] error. Signed-off-by: zhangyuan21 --- sched/pthread/pthread_detach.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/sched/pthread/pthread_detach.c b/sched/pthread/pthread_detach.c index 8535971084f..91fa802db10 100644 --- a/sched/pthread/pthread_detach.c +++ b/sched/pthread/pthread_detach.c @@ -76,8 +76,23 @@ int pthread_detach(pthread_t thread) pjoin = pthread_findjoininfo(group, (pid_t)thread); if (!pjoin) { + FAR struct tcb_s *tcb = nxsched_get_tcb((pid_t)thread); + serr("ERROR: Could not find thread entry\n"); - ret = EINVAL; + + if (tcb == NULL) + { + ret = ESRCH; + } + + /* The thread is still active but has no join info. In that + * case, it must be a task and not a pthread. + */ + + else + { + ret = EINVAL; + } } else {