This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
Pthread NULL pointer dereference
- From: Kelvin Lawson <news at kibosh dot org>
- To: ecos-patches at sources dot redhat dot com
- Date: Wed, 28 Oct 2009 00:19:23 +0000
- Subject: Pthread NULL pointer dereference
Hi,
I've attached a patch for pthread.cxx to prevent a NULL pointer
dereference if pthread_getspecific()/pthread_setspecific() are called by
threads which were not created by the pthread subsystem.
Clearly threads which are not created via pthreads should not call the
pthread APIs, however if they do so they should fail gracefully. We've
seen this happen with an "all-pthread" application because there are
actually still a few system threads (e.g. network alarm) which are pure
eCos threads.
Cheers,
Kelvin.
? pthread.patch
Index: compat/posix/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/compat/posix/current/ChangeLog,v
retrieving revision 1.56
diff -u -r1.56 ChangeLog
--- compat/posix/current/ChangeLog 25 Mar 2009 08:03:56 -0000 1.56
+++ compat/posix/current/ChangeLog 27 Oct 2009 22:58:23 -0000
@@ -1,3 +1,9 @@
+2009-10-28 Kelvin Lawson <kelvinl@users.sf.net>
+
+ * src/pthread.cxx: Add NULL pointer checks in case various
+ functions are called by threads which were not created via
+ pthreads.
+
2009-03-25 John Dallaway <john@dallaway.org.uk>
* src/signal.cxx (pause): Revert change of 2006-07-18 pending
Index: compat/posix/current/src/pthread.cxx
===================================================================
RCS file: /cvs/ecos/ecos/packages/compat/posix/current/src/pthread.cxx,v
retrieving revision 1.16
diff -u -r1.16 pthread.cxx
--- compat/posix/current/src/pthread.cxx 29 Jan 2009 17:47:52 -0000 1.16
+++ compat/posix/current/src/pthread.cxx 27 Oct 2009 22:58:24 -0000
@@ -1441,6 +1441,8 @@
PTHREAD_RETURN(EINVAL);
pthread_info *self = pthread_self_info();
+ if( self == NULL )
+ PTHREAD_RETURN(EINVAL);
if( self->thread_data == NULL )
{
@@ -1472,6 +1474,8 @@
PTHREAD_RETURN(NULL);
pthread_info *self = pthread_self_info();
+ if( self == NULL )
+ PTHREAD_RETURN(NULL);
if( self->thread_data == NULL )
val = NULL;