diff options
| author | Bernard Xiong <[email protected]> | 2021-03-31 13:43:23 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-03-31 13:43:23 +0800 |
| commit | 6169669cd8fbc0ef5f046a9637cb3a0d8f791a59 (patch) | |
| tree | a7b728e9934f75a9e7d51ca361f9e00f3cfcb2c1 | |
| parent | 69c01563688855abbc7b5864ede37cde1cecba16 (diff) | |
| parent | 7c999e195016456f1b0c977afa8f658c1727994d (diff) | |
Merge pull request #4556 from jesHrz/jeshrz/check-null-pointer
[pthread] Enhance robustness for pthread
| -rw-r--r-- | components/libc/pthreads/pthread.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/components/libc/pthreads/pthread.c b/components/libc/pthreads/pthread.c index 8a728c4e99..79104d1fd5 100644 --- a/components/libc/pthreads/pthread.c +++ b/components/libc/pthreads/pthread.c @@ -209,6 +209,8 @@ int pthread_create(pthread_t *pid, /* get pthread data */ ptd = _pthread_get_data(pth_id); + RT_ASSERT(ptd != RT_NULL); + if (attr != RT_NULL) { ptd->attr = *attr; @@ -299,6 +301,12 @@ int pthread_detach(pthread_t thread) { int ret = 0; _pthread_data_t *ptd = _pthread_get_data(thread); + if (ptd == RT_NULL) + { + /* invalid pthread id */ + ret = EINVAL; + goto __exit; + } rt_enter_critical(); if (ptd->attr.detachstate == PTHREAD_CREATE_DETACHED) @@ -360,6 +368,12 @@ int pthread_join(pthread_t thread, void **value_ptr) rt_err_t result; ptd = _pthread_get_data(thread); + + if (ptd == RT_NULL) + { + return EINVAL; /* invalid pthread id */ + } + if (ptd && ptd->tid == rt_thread_self()) { /* join self */ @@ -367,7 +381,9 @@ int pthread_join(pthread_t thread, void **value_ptr) } if (ptd->attr.detachstate == PTHREAD_CREATE_DETACHED) + { return EINVAL; /* join on a detached pthread */ + } result = rt_sem_take(ptd->joinable_sem, RT_WAITING_FOREVER); if (result == RT_EOK) @@ -662,7 +678,10 @@ int pthread_cancel(pthread_t thread) /* get posix thread data */ ptd = _pthread_get_data(thread); - RT_ASSERT(ptd != RT_NULL); + if (ptd == RT_NULL) + { + return EINVAL; + } /* cancel self */ if (ptd->tid == rt_thread_self()) |
