[PATCH] libthr - pthread_set_name_np crash
David Xu
davidxu at freebsd.org
Thu Apr 5 02:33:03 UTC 2007
Ed Maste wrote:
> It seems there is a bug in pthread_set_name_np for the thread != curthread
> case. That is, pthread_set_name_np called from outside of the thread
> being named, as in the following example:
>
> pthread_create(&pt, 0, t_spin, (void *)1);
> [...]
> pthread_set_name_np(pt, "t1");
>
> The bug is a race condition that leads to thread->locklevel being
> incorrect. Based on the other cases of locking a not-curthread thread,
> I think the patch below is the fix. Can a libthr expert comment?
>
> Thanks,
> Ed
>
> Index: thr_info.c
> ===================================================================
> RCS file: /usr/cvs/src/lib/libthr/thread/thr_info.c,v
> retrieving revision 1.9
> diff -u -r1.9 thr_info.c
> --- thr_info.c 12 Jan 2007 07:26:20 -0000 1.9
> +++ thr_info.c 23 Mar 2007 14:56:13 -0000
> @@ -52,12 +52,12 @@
> ret = errno;
> } else {
> if (_thr_ref_add(curthread, thread, 0) == 0) {
> - THR_LOCK(thread);
> + THR_THREAD_LOCK(curthread, thread);
> if (thread->state != PS_DEAD) {
> if (thr_set_name(thread->tid, name))
> ret = errno;
> }
> - THR_UNLOCK(thread);
> + THR_THREAD_UNLOCK(curthread, thread);
> _thr_ref_delete(curthread, thread);
> } else {
> ret = ESRCH;
Yes, this patch is correct, please commit it.
Regards,
David Xu
More information about the freebsd-threads
mailing list