From: Bart Van Assche Date: Wed, 9 Mar 2011 17:53:28 +0000 (+0000) Subject: DRD: Report an error if an invalid argument is passed to pthread_detach(). Do not... X-Git-Tag: svn/VALGRIND_3_7_0~615 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8c2ede1182ebb5135a6b8f77948adb5c8eb11834;p=thirdparty%2Fvalgrind.git DRD: Report an error if an invalid argument is passed to pthread_detach(). Do not assume that pthread_detach() returns an error code if its argument is invalid. Should fix #267968. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11614 --- diff --git a/drd/drd_clientreq.c b/drd/drd_clientreq.c index d08d25eff5..8e9eb82565 100644 --- a/drd/drd_clientreq.c +++ b/drd/drd_clientreq.c @@ -210,9 +210,20 @@ static Bool handle_client_request(ThreadId vg_tid, UWord* arg, UWord* ret) break; case VG_USERREQ__SET_JOINABLE: - DRD_(thread_set_joinable)(DRD_(PtThreadIdToDrdThreadId)(arg[1]), - (Bool)arg[2]); + { + const DrdThreadId drd_joinable = DRD_(PtThreadIdToDrdThreadId)(arg[1]); + if (drd_joinable != DRD_INVALID_THREADID) + DRD_(thread_set_joinable)(drd_joinable, (Bool)arg[2]); + else { + InvalidThreadIdInfo ITI = { DRD_(thread_get_running_tid)(), arg[1] }; + VG_(maybe_record_error)(vg_tid, + InvalidThreadId, + VG_(get_IP)(vg_tid), + "pthread_detach(): invalid thread ID", + &ITI); + } break; + } case VG_USERREQ__ENTERING_PTHREAD_CREATE: DRD_(thread_entering_pthread_create)(drd_tid); diff --git a/drd/drd_pthread_intercepts.c b/drd/drd_pthread_intercepts.c index 45a464c302..6b0b3fe41e 100644 --- a/drd/drd_pthread_intercepts.c +++ b/drd/drd_pthread_intercepts.c @@ -463,14 +463,11 @@ int pthread_detach_intercept(pthread_t pt_thread) { int ret; OrigFn fn; + VALGRIND_GET_ORIG_FN(fn); - { - CALL_FN_W_W(ret, fn, pt_thread); - if (ret == 0) - { - DRD_(set_joinable)(pt_thread, 0); - } - } + CALL_FN_W_W(ret, fn, pt_thread); + DRD_(set_joinable)(pt_thread, 0); + return ret; }