From: Bart Van Assche Date: Tue, 8 Mar 2011 18:34:44 +0000 (+0000) Subject: DRD: Fixed a race condition triggered by invoking pthread_detach() with an argument... X-Git-Tag: svn/VALGRIND_3_7_0~617 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=942bd034c88627be86138cf739573a4d310803c5;p=thirdparty%2Fvalgrind.git DRD: Fixed a race condition triggered by invoking pthread_detach() with an argument not equal to pthread_self(). Potential fix for #267968. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11612 --- diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c index aae0582807..45a464c302 100644 --- a/drd/drd_pthread_intercepts.c +++ b/drd/drd_pthread_intercepts.c @@ -269,7 +269,6 @@ static void* DRD_(thread_wrapper)(void* arg) arg_ptr = (DrdPosixThreadArgs*)arg; arg_copy = *arg_ptr; - arg_ptr->wrapper_started = 1; VALGRIND_DO_CLIENT_REQUEST(res, -1, VG_USERREQ__SET_PTHREADID, pthread_self(), 0, 0, 0, 0); @@ -277,6 +276,13 @@ static void* DRD_(thread_wrapper)(void* arg) DRD_(set_joinable)(pthread_self(), arg_copy.detachstate == PTHREAD_CREATE_JOINABLE); + /* + * Only set 'wrapper_started' after VG_USERREQ__SET_PTHREADID and + * DRD_(set_joinable)() have been invoked to avoid a race with + * a pthread_detach() invocation for this thread from another thread. + */ + arg_ptr->wrapper_started = 1; + return (arg_copy.start)(arg_copy.arg); }