Date: Tue, 30 Apr 2002 15:12:40 -0700 (PDT) From: Archie Cobbs <archie@dellroad.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: bin/37614: libc_r aborts when exiting thread is canceled Message-ID: <200204302212.g3UMCeV89274@arch20m.dellroad.org>
next in thread | raw e-mail | index | archive | help
>Number: 37614
>Category: bin
>Synopsis: libc_r aborts when exiting thread is canceled
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Apr 30 15:20:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Archie Cobbs
>Release: FreeBSD 4.5-RELEASE i386
>Organization:
Packet Design
>Environment:
System: FreeBSD arch20m.dellroad.org 4.5-RELEASE FreeBSD 4.5-RELEASE #1: Sat Feb 2 19:17:35 PST 2002 root@arch20m.dellroad.org:/usr/obj/usr/src/sys/THINKPAD i386
>Description:
There seems to be a bug or problem in our pthreads implementation.
Consider a thread that has exited and is invoking its cleanup routines.
Another thread cancels that thread. Then one of the cleanup routines
invokes a function which is a cancelation point.
Here's what happens:
> Fatal error 'Thread 0x806fc00 has called pthread_exit() from a destructor. POS
IX 1003.1 1996 s16.2.5.2 does not allow this!' at line ? in file /usr/src/lib/li
bc_r/uthread/uthread_exit.c (errno = ?)
>
> Program received signal SIGABRT, Aborted.
> 0x281ee53c in kill () from /usr/lib/libc_r.so.4
> (gdb) where
> #0 0x281ee53c in kill () from /usr/lib/libc_r.so.4
> #1 0x2823878a in abort () from /usr/lib/libc_r.so.4
> #2 0x2820504a in _thread_exit () from /usr/lib/libc_r.so.4
> #3 0x282050e9 in pthread_exit () from /usr/lib/libc_r.so.4
> #4 0x282370d7 in pthread_testcancel () from /usr/lib/libc_r.so.4
> #5 0x282370f8 in _thread_enter_cancellation_point () from /usr/lib/libc_r.so.
4
> #6 0x28236bc4 in close () from /usr/lib/libc_r.so.4
> #7 0x28193416 in timeout_fp_close (cookie=0x80645b4)
> at /usr/home/archie/libpdel/io/timeout_fp.c:148
> #8 0x2822622b in fclose () from /usr/lib/libc_r.so.4
> #9 0x2818e780 in foobar_connection_free (connp=0xbfadced4)
> at /usr/home/archie/libpdel/http/http_connection.c:136
> #10 0x28185d07 in foobar_server_connection_cleanup (arg=0x8062584)
> at /usr/home/archie/libpdel/http/http_server.c:650
> #11 0x2820611d in pthread_cleanup_pop () from /usr/lib/libc_r.so.4
> #12 0x2820511e in pthread_exit () from /usr/lib/libc_r.so.4
> #13 0x281c5f99 in _thread_start () from /usr/lib/libc_r.so.4
> #14 0x0 in ?? ()
It seems that pthread_testcancel() should do nothing if the
thread is already in the process of exiting. Below is a patch.
>How-To-Repeat:
>Fix:
This is just a guess, but...
Index: uthread_cancel.c
===================================================================
RCS file: /home/cvs/freebsd/src/lib/libc_r/uthread/uthread_cancel.c,v
retrieving revision 1.3.2.4
diff -u -r1.3.2.4 uthread_cancel.c
--- uthread_cancel.c 19 Aug 2001 11:45:58 -0000 1.3.2.4
+++ uthread_cancel.c 30 Apr 2002 22:13:44 -0000
@@ -186,7 +186,8 @@
pthread_testcancel(void)
{
if (((_thread_run->cancelflags & PTHREAD_CANCEL_DISABLE) == 0) &&
- ((_thread_run->cancelflags & PTHREAD_CANCELLING) != 0)) {
+ ((_thread_run->cancelflags & PTHREAD_CANCELLING) != 0) &&
+ ((_thread_run->flags & PTHREAD_EXITING) != 0)) {
/*
* It is possible for this thread to be swapped out
* while performing cancellation; do not allow it
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200204302212.g3UMCeV89274>
