about summary refs log tree commit diff
path: root/linuxthreads_db/td_ta_map_id2thr.c
diff options
context:
space:
mode:
Diffstat (limited to 'linuxthreads_db/td_ta_map_id2thr.c')
-rw-r--r--linuxthreads_db/td_ta_map_id2thr.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/linuxthreads_db/td_ta_map_id2thr.c b/linuxthreads_db/td_ta_map_id2thr.c
index ffbc8b2908..6fb1ba96aa 100644
--- a/linuxthreads_db/td_ta_map_id2thr.c
+++ b/linuxthreads_db/td_ta_map_id2thr.c
@@ -24,14 +24,21 @@
 td_err_e
 td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
 {
-  struct pthread_handle_struct *handles = ta->handles;
   struct pthread_handle_struct phc;
-  int pthread_threads_max = ta->pthread_threads_max;
+  struct _pthread_descr_struct pds;
+  int pthread_threads_max;
 
   LOG (__FUNCTION__);
 
+  /* Test whether the TA parameter is ok.  */
+  if (! ta_ok (ta))
+    return TD_BADTA;
+
+  /* Make the following expression a bit smaller.  */
+  pthread_threads_max = ta->pthread_threads_max;
+
   /* We can compute the entry in the handle array we want.  */
-  if (ps_pdread (ta->ph, handles + pt % pthread_threads_max, &phc,
+  if (ps_pdread (ta->ph, ta->handles + pt % pthread_threads_max, &phc,
 		 sizeof (struct pthread_handle_struct)) != PS_OK)
     return TD_ERR;	/* XXX Other error value?  */
 
@@ -39,6 +46,15 @@ td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th)
   if (phc.h_descr == NULL)
     return TD_BADTH;
 
+  /* Next test: get the descriptor to see whether this is not an old
+     thread handle.  */
+  if (ps_pdread (ta->ph, phc.h_descr, &pds,
+		 sizeof (struct _pthread_descr_struct)) != PS_OK)
+    return TD_ERR;	/* XXX Other error value?  */
+
+  if (pds.p_tid != pt)
+    return TD_BADTH;
+
   /* Create the `td_thrhandle_t' object.  */
   th->th_ta_p = (td_thragent_t *) ta;
   th->th_unique = phc.h_descr;