mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
added check to avoid array out of boud access
This commit is contained in:
parent
f2e28c8146
commit
345e76a0d7
@ -76,6 +76,7 @@ static char pthread_reaper_stack[PTHREAD_REAPER_STACKSIZE];
|
|||||||
static void pthread_start_routine(void)
|
static void pthread_start_routine(void)
|
||||||
{
|
{
|
||||||
pthread_t self = pthread_self();
|
pthread_t self = pthread_self();
|
||||||
|
|
||||||
pthread_thread_t *pt = pthread_sched_threads[self-1];
|
pthread_thread_t *pt = pthread_sched_threads[self-1];
|
||||||
void *retval = pt->start_routine(pt->arg);
|
void *retval = pt->start_routine(pt->arg);
|
||||||
pthread_exit(retval);
|
pthread_exit(retval);
|
||||||
@ -161,7 +162,15 @@ int pthread_create(pthread_t *newthread, const pthread_attr_t *attr, void *(*sta
|
|||||||
|
|
||||||
void pthread_exit(void *retval)
|
void pthread_exit(void *retval)
|
||||||
{
|
{
|
||||||
pthread_thread_t *self = pthread_sched_threads[pthread_self()-1];
|
pthread_t self_id = pthread_self();
|
||||||
|
|
||||||
|
if (self_id == 0) {
|
||||||
|
DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__);
|
||||||
|
sched_task_exit();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_thread_t *self = pthread_sched_threads[self_id-1];
|
||||||
|
|
||||||
while (self->cleanup_top) {
|
while (self->cleanup_top) {
|
||||||
__pthread_cleanup_datum_t *ct = self->cleanup_top;
|
__pthread_cleanup_datum_t *ct = self->cleanup_top;
|
||||||
@ -193,6 +202,11 @@ void pthread_exit(void *retval)
|
|||||||
|
|
||||||
int pthread_join(pthread_t th, void **thread_return)
|
int pthread_join(pthread_t th, void **thread_return)
|
||||||
{
|
{
|
||||||
|
if (th < 1 || th > MAXTHREADS) {
|
||||||
|
DEBUG("passed pthread_t th (%d) exceeds bounds of pthread_sched_threads[] in \"%s\"!\n", th, __func__);
|
||||||
|
return -3;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_thread_t *other = pthread_sched_threads[th-1];
|
pthread_thread_t *other = pthread_sched_threads[th-1];
|
||||||
if (!other) {
|
if (!other) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -222,6 +236,11 @@ int pthread_join(pthread_t th, void **thread_return)
|
|||||||
|
|
||||||
int pthread_detach(pthread_t th)
|
int pthread_detach(pthread_t th)
|
||||||
{
|
{
|
||||||
|
if (th < 1 || th > MAXTHREADS) {
|
||||||
|
DEBUG("passed pthread_t th (%d) exceeds bounds of pthread_sched_threads[] in \"%s\"!\n", th, __func__);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_thread_t *other = pthread_sched_threads[th-1];
|
pthread_thread_t *other = pthread_sched_threads[th-1];
|
||||||
if (!other) {
|
if (!other) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -288,6 +307,12 @@ int pthread_setcanceltype(int type, int *oldtype)
|
|||||||
void pthread_testcancel(void)
|
void pthread_testcancel(void)
|
||||||
{
|
{
|
||||||
pthread_t self = pthread_self();
|
pthread_t self = pthread_self();
|
||||||
|
|
||||||
|
if (self == 0) {
|
||||||
|
DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (pthread_sched_threads[self-1]->should_cancel) {
|
if (pthread_sched_threads[self-1]->should_cancel) {
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
@ -295,14 +320,28 @@ void pthread_testcancel(void)
|
|||||||
|
|
||||||
void __pthread_cleanup_push(__pthread_cleanup_datum_t *datum)
|
void __pthread_cleanup_push(__pthread_cleanup_datum_t *datum)
|
||||||
{
|
{
|
||||||
pthread_thread_t *self = pthread_sched_threads[pthread_self()-1];
|
pthread_t self_id = pthread_self();
|
||||||
|
|
||||||
|
if (self_id == 0) {
|
||||||
|
DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_thread_t *self = pthread_sched_threads[self_id-1];
|
||||||
datum->__next = self->cleanup_top;
|
datum->__next = self->cleanup_top;
|
||||||
self->cleanup_top = datum;
|
self->cleanup_top = datum;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __pthread_cleanup_pop(__pthread_cleanup_datum_t *datum, int execute)
|
void __pthread_cleanup_pop(__pthread_cleanup_datum_t *datum, int execute)
|
||||||
{
|
{
|
||||||
pthread_thread_t *self = pthread_sched_threads[pthread_self()-1];
|
pthread_t self_id = pthread_self();
|
||||||
|
|
||||||
|
if (self_id == 0) {
|
||||||
|
DEBUG("ERROR called pthread_self() returned 0 in \"%s\"!\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_thread_t *self = pthread_sched_threads[self_id-1];
|
||||||
self->cleanup_top = datum->__next;
|
self->cleanup_top = datum->__next;
|
||||||
|
|
||||||
if (execute != 0) {
|
if (execute != 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user