This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
fix possible segfault creating detached thread
- From: Mike Gorse <mgorse at alum dot wpi dot edu>
- To: cygwin-patches at cygwin dot com
- Date: Sun, 31 Jul 2005 15:17:44 -0400 (EDT)
- Subject: fix possible segfault creating detached thread
This patch fixes a seg fault when a thread is created in a detached state
and terminates the first time it is scheduled. pthread::create (the
four-parameter version) calls the three-parameter pthread::create function
which unlocks the mutex, allowing the called thread to be scheduled, then
exits at which point the outer create function calls is_good_objectg(),
but this causes a core dump if pthread::exit() has already been called and
deleted the pthread object.
2005-07-31 Michael Gorse <mgorse@alum.wpi.edu>
* thread.cc (pthread::create): Make bool.
* thread.cc (pthread_null::create): Ditto.
* thread.h: Ditto.
* pthread.cc (pthread_create): Check return of inner create rather
than calling is_good_object().
---
Index: thread.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/thread.cc,v
retrieving revision 1.190
diff -u -p -r1.190 thread.cc
--- thread.cc 6 Jul 2005 20:05:03 -0000 1.190
+++ thread.cc 31 Jul 2005 02:13:14 -0000
@@ -491,13 +491,15 @@ pthread::precreate (pthread_attr *newatt
magic = 0;
}
-void
+bool
pthread::create (void *(*func) (void *), pthread_attr *newattr,
void *threadarg)
{
+ bool retval;
+
precreate (newattr);
if (!magic)
- return;
+ return false;
function = func;
arg = threadarg;
@@ -517,7 +519,9 @@ pthread::create (void *(*func) (void *),
while (!cygtls)
low_priority_sleep (0);
}
+ retval =magic;
mutex.unlock ();
+ return retval;
}
void
@@ -1993,8 +1997,7 @@ pthread::create (pthread_t *thread, cons
return EINVAL;
*thread = new pthread ();
- (*thread)->create (start_routine, attr ? *attr : NULL, arg);
- if (!is_good_object (thread))
+ if (!(*thread)->create (start_routine, attr ? *attr : NULL, arg))
{
delete (*thread);
*thread = NULL;
@@ -3262,9 +3265,10 @@ pthread_null::~pthread_null ()
{
}
-void
+bool
pthread_null::create (void *(*)(void *), pthread_attr *, void *)
{
+ return true;
}
void
Index: thread.h
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/thread.h,v
retrieving revision 1.100
diff -u -p -r1.100 thread.h
--- thread.h 5 Jul 2005 03:16:46 -0000 1.100
+++ thread.h 31 Jul 2005 02:10:52 -0000
@@ -380,7 +380,7 @@ public:
HANDLE cancel_event;
pthread_t joiner;
- virtual void create (void *(*)(void *), pthread_attr *, void *);
+ virtual bool create (void *(*)(void *), pthread_attr *, void *);
pthread ();
virtual ~pthread ();
@@ -473,7 +473,7 @@ class pthread_null : public pthread
/* From pthread These should never get called
* as the ojbect is not verifyable
*/
- void create (void *(*)(void *), pthread_attr *, void *);
+ bool create (void *(*)(void *), pthread_attr *, void *);
void exit (void *value_ptr) __attribute__ ((noreturn));
int cancel ();
void testcancel ();