summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxiangxistu <[email protected]>2022-08-08 11:16:17 +0800
committerGitHub <[email protected]>2022-08-07 23:16:17 -0400
commite61d05ca1a9e6b8a83c928ab1f893246629bbd2f (patch)
tree969c06f626d801311ea827bdd0c0e0bea878e7ef
parent79934777d04eddc54f6e608398091aaef6cc2aa4 (diff)
[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".
-rw-r--r--components/libc/compilers/common/cstdlib.c7
-rw-r--r--components/libc/posix/pthreads/pthread.c34
-rw-r--r--include/rtdef.h6
-rw-r--r--src/thread.c4
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 */