This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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 ();


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]