提交 29bad49d 编写于 作者: R Rich Felker

fix data race in timer_create with SIGEV_THREAD notification

in the timer thread start function, self->timer_id was accessed
without synchronization; the timer thread could fail to see the store
from the calling thread, resulting in timer_delete failing to delete
the correct kernel-level timer.

this fix is based on a patch by changdiankang, but with the load moved
to after receiving the timer_delete signal rather than just after the
start barrier, so as not to retain the possibility of data race with
timer_delete.
上级 7d5c5706
#include <time.h>
#include <setjmp.h>
#include <limits.h>
#include "pthread_impl.h"
struct ksigevent {
......@@ -48,7 +49,6 @@ static void *start(void *arg)
{
pthread_t self = __pthread_self();
struct start_args *args = arg;
int id = self->timer_id;
jmp_buf jb;
void (*notify)(union sigval) = args->sev->sigev_notify_function;
......@@ -65,7 +65,7 @@ static void *start(void *arg)
}
if (self->timer_id < 0) break;
}
__syscall(SYS_timer_delete, id);
__syscall(SYS_timer_delete, self->timer_id & INT_MAX);
return 0;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册