From e61d05ca1a9e6b8a83c928ab1f893246629bbd2f Mon Sep 17 00:00:00 2001 From: xiangxistu <52819708+xiangxistu@users.noreply.github.com> Date: Mon, 8 Aug 2022 11:16:17 +0800 Subject: [PATCH] [fix] the risk for function exit() when open pthread support. (#6229) * [fix] the risk for function exit() when open pthread support. * [update] modify annotation from "user data" to "pthread_data". --- components/libc/compilers/common/cstdlib.c | 7 +++-- components/libc/posix/pthreads/pthread.c | 34 +++++++++++----------- include/rtdef.h | 6 +++- src/thread.c | 4 +++ 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/components/libc/compilers/common/cstdlib.c b/components/libc/compilers/common/cstdlib.c index 9d1667b5d3..3ed5a228c8 100644 --- a/components/libc/compilers/common/cstdlib.c +++ b/components/libc/compilers/common/cstdlib.c @@ -21,8 +21,11 @@ void __rt_libc_exit(int status) if (self != RT_NULL) { #ifdef RT_USING_PTHREADS - extern void pthread_exit(void *value); - pthread_exit((void *)status); + if(self->pthread_data != RT_NULL) + { + extern void pthread_exit(void *value); + pthread_exit((void *)status); + } #else LOG_E("thread:%s exit:%d!", self->name, status); rt_thread_control(self, RT_THREAD_CTRL_CLOSE, RT_NULL); diff --git a/components/libc/posix/pthreads/pthread.c b/components/libc/posix/pthreads/pthread.c index a7dcc9ee7c..f193763548 100644 --- a/components/libc/posix/pthreads/pthread.c +++ b/components/libc/posix/pthreads/pthread.c @@ -135,8 +135,8 @@ void _pthread_data_destroy(_pthread_data_t *ptd) /* clean magic */ ptd->magic = 0x0; - /* clear the "ptd->tid->user_data" */ - ptd->tid->user_data = RT_NULL; + /* clear the "ptd->tid->pthread_data" */ + ptd->tid->pthread_data = RT_NULL; /* free ptd */ rt_free(ptd); @@ -281,7 +281,7 @@ int pthread_create(pthread_t *pid, /* set pthread cleanup function and ptd data */ ptd->tid->cleanup = _pthread_cleanup; - ptd->tid->user_data = (rt_ubase_t)ptd; + ptd->tid->pthread_data = (void *)ptd; /* start thread */ if (rt_thread_startup(ptd->tid) == RT_EOK) @@ -394,8 +394,8 @@ pthread_t pthread_self (void) tid = rt_thread_self(); if (tid == NULL) return PTHREAD_NUM_MAX; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); return _pthread_data_get_pth(ptd); @@ -477,8 +477,8 @@ void pthread_exit(void *value) return; } - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; rt_enter_critical(); /* disable cancel */ @@ -595,8 +595,8 @@ void pthread_cleanup_pop(int execute) if (rt_thread_self() == NULL) return; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); if (execute) @@ -624,8 +624,8 @@ void pthread_cleanup_push(void (*routine)(void *), void *arg) if (rt_thread_self() == NULL) return; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); cleanup = (_pthread_cleanup_t *)rt_malloc(sizeof(_pthread_cleanup_t)); @@ -676,8 +676,8 @@ int pthread_setcancelstate(int state, int *oldstate) if (rt_thread_self() == NULL) return EINVAL; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); if ((state == PTHREAD_CANCEL_ENABLE) || (state == PTHREAD_CANCEL_DISABLE)) @@ -699,8 +699,8 @@ int pthread_setcanceltype(int type, int *oldtype) if (rt_thread_self() == NULL) return EINVAL; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); if ((type != PTHREAD_CANCEL_DEFERRED) && (type != PTHREAD_CANCEL_ASYNCHRONOUS)) @@ -721,8 +721,8 @@ void pthread_testcancel(void) if (rt_thread_self() == NULL) return; - /* get pthread data from user data of thread */ - ptd = (_pthread_data_t *)rt_thread_self()->user_data; + /* get pthread data from pthread_data of thread */ + ptd = (_pthread_data_t *)rt_thread_self()->pthread_data; RT_ASSERT(ptd != RT_NULL); if (ptd->cancelstate == PTHREAD_CANCEL_ENABLE) diff --git a/include/rtdef.h b/include/rtdef.h index 94c2466f0b..0de2c22ec4 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -690,9 +690,13 @@ struct rt_thread rt_ubase_t remaining_tick; /**< remaining tick */ #ifdef RT_USING_CPU_USAGE - rt_uint64_t duration_tick; /**< cpu usage tick */ + rt_uint64_t duration_tick; /**< cpu usage tick */ #endif /* RT_USING_CPU_USAGE */ +#ifdef RT_USING_PTHREADS + void *pthread_data; /**< the handle of pthread data, adapt 32/64bit */ +#endif /* RT_USING_PTHREADS */ + struct rt_timer thread_timer; /**< built-in thread timer */ void (*cleanup)(struct rt_thread *tid); /**< cleanup function when thread exit */ diff --git a/src/thread.c b/src/thread.c index eea42dab8e..f840fdd231 100644 --- a/src/thread.c +++ b/src/thread.c @@ -252,6 +252,10 @@ static rt_err_t _thread_init(struct rt_thread *thread, thread->duration_tick = 0; #endif /* RT_USING_CPU_USAGE */ +#ifdef RT_USING_PTHREADS + thread->pthread_data = RT_NULL; +#endif /* RT_USING_PTHREADS */ + #ifdef RT_USING_MODULE thread->module_id = 0; #endif /* RT_USING_MODULE */ -- GitLab