diff options
author | jb <jb@FreeBSD.org> | 1998-06-09 23:08:41 +0000 |
---|---|---|
committer | jb <jb@FreeBSD.org> | 1998-06-09 23:08:41 +0000 |
commit | 10b40100e5df4d90faef790040245659fd87b28b (patch) | |
tree | 8811cbcc4a0311cc21bddabddb5997aa05198e39 /lib | |
parent | ca0476a680640c407e6251600410113319f64bc0 (diff) | |
download | FreeBSD-src-10b40100e5df4d90faef790040245659fd87b28b.zip FreeBSD-src-10b40100e5df4d90faef790040245659fd87b28b.tar.gz |
POSIX says that pthread_exit() is not allowed to be called from a
cleanup destructor, so trap this case to prevent me from being being
burnt again by applications that try to do this. With this change, an
application (like one using a mis-configured ACE) will exit the process
after displaying a message quoting the POSIX section that the application
has violated.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc_r/uthread/uthread_exit.c | 10 | ||||
-rw-r--r-- | lib/libkse/thread/thr_exit.c | 10 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_exit.c | 10 |
3 files changed, 30 insertions, 0 deletions
diff --git a/lib/libc_r/uthread/uthread_exit.c b/lib/libc_r/uthread/uthread_exit.c index 4bc7da9..0083f2b 100644 --- a/lib/libc_r/uthread/uthread_exit.c +++ b/lib/libc_r/uthread/uthread_exit.c @@ -102,6 +102,16 @@ pthread_exit(void *status) long l; pthread_t pthread; + /* Check if this thread is already in the process of exiting: */ + if ((_thread_run->flags & PTHREAD_EXITING) != 0) { + char msg[128]; + snprintf(msg,"Thread %p has called pthread_exit() from a destructor. POSIX 1003.1 1996 s16.2.5.2 does not allow this!",_thread_run); + PANIC(msg); + } + + /* Flag this thread as exiting: */ + _thread_run->flags |= PTHREAD_EXITING; + /* Save the return value: */ _thread_run->ret = status; diff --git a/lib/libkse/thread/thr_exit.c b/lib/libkse/thread/thr_exit.c index 4bc7da9..0083f2b 100644 --- a/lib/libkse/thread/thr_exit.c +++ b/lib/libkse/thread/thr_exit.c @@ -102,6 +102,16 @@ pthread_exit(void *status) long l; pthread_t pthread; + /* Check if this thread is already in the process of exiting: */ + if ((_thread_run->flags & PTHREAD_EXITING) != 0) { + char msg[128]; + snprintf(msg,"Thread %p has called pthread_exit() from a destructor. POSIX 1003.1 1996 s16.2.5.2 does not allow this!",_thread_run); + PANIC(msg); + } + + /* Flag this thread as exiting: */ + _thread_run->flags |= PTHREAD_EXITING; + /* Save the return value: */ _thread_run->ret = status; diff --git a/lib/libpthread/thread/thr_exit.c b/lib/libpthread/thread/thr_exit.c index 4bc7da9..0083f2b 100644 --- a/lib/libpthread/thread/thr_exit.c +++ b/lib/libpthread/thread/thr_exit.c @@ -102,6 +102,16 @@ pthread_exit(void *status) long l; pthread_t pthread; + /* Check if this thread is already in the process of exiting: */ + if ((_thread_run->flags & PTHREAD_EXITING) != 0) { + char msg[128]; + snprintf(msg,"Thread %p has called pthread_exit() from a destructor. POSIX 1003.1 1996 s16.2.5.2 does not allow this!",_thread_run); + PANIC(msg); + } + + /* Flag this thread as exiting: */ + _thread_run->flags |= PTHREAD_EXITING; + /* Save the return value: */ _thread_run->ret = status; |