about summary refs log tree commit diff
path: root/src/internal
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-08-03 13:20:42 -0400
committerRich Felker <dalias@aerifal.cx>2013-08-03 13:20:42 -0400
commit7356c2554e33cf16768616e8e3ae4a4f5a5aac17 (patch)
tree9510cb631685508d9ece852b7ce865e91a903589 /src/internal
parent14012b91f2b52f70fd3f3bb807fb880654337da5 (diff)
downloadmusl-7356c2554e33cf16768616e8e3ae4a4f5a5aac17.tar.gz
musl-7356c2554e33cf16768616e8e3ae4a4f5a5aac17.tar.xz
musl-7356c2554e33cf16768616e8e3ae4a4f5a5aac17.zip
fix multiple bugs in SIGEV_THREAD timers
1. the thread result field was reused for storing a kernel timer id,
but would be overwritten if the application code exited or cancelled
the thread.

2. low pointer values were used as the indicator that the timer id is
a kernel timer id rather than a thread id. this is not portable, as
mmap may return low pointers on some conditions. instead, use the fact
that pointers must be aligned and kernel timer ids must be
non-negative to map pointers into the negative integer space.

3. signals were not blocked until after the timer thread started, so a
race condition could allow a signal handler to run in the timer thread
when it's not supposed to exist. this is mainly problematic if the
calling thread was the only thread where the signal was unblocked and
the signal handler assumes it runs in that thread.
Diffstat (limited to 'src/internal')
-rw-r--r--src/internal/pthread_impl.h2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h
index 67b05753..2e910b3e 100644
--- a/src/internal/pthread_impl.h
+++ b/src/internal/pthread_impl.h
@@ -38,7 +38,7 @@ struct pthread {
 		void *pending;
 	} robust_list;
 	int unblock_cancel;
-	int delete_timer;
+	int timer_id;
 	locale_t locale;
 	int killlock[2];
 	int exitlock[2];