Explorar el Código

enhance robustness for pthread

jeshrz hace 4 años
padre
commit
7c999e1950
Se han modificado 1 ficheros con 20 adiciones y 1 borrados
  1. 20 1
      components/libc/pthreads/pthread.c

+ 20 - 1
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())