|
From: <sv...@va...> - 2011-03-09 17:53:37
|
Author: bart
Date: 2011-03-09 17:53:28 +0000 (Wed, 09 Mar 2011)
New Revision: 11614
Log:
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.
Modified:
trunk/drd/drd_clientreq.c
trunk/drd/drd_pthread_intercepts.c
Modified: trunk/drd/drd_clientreq.c
===================================================================
--- trunk/drd/drd_clientreq.c 2011-03-09 17:50:34 UTC (rev 11613)
+++ trunk/drd/drd_clientreq.c 2011-03-09 17:53:28 UTC (rev 11614)
@@ -210,9 +210,20 @@
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);
Modified: trunk/drd/drd_pthread_intercepts.c
===================================================================
--- trunk/drd/drd_pthread_intercepts.c 2011-03-09 17:50:34 UTC (rev 11613)
+++ trunk/drd/drd_pthread_intercepts.c 2011-03-09 17:53:28 UTC (rev 11614)
@@ -463,14 +463,11 @@
{
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;
}
|