summaryrefslogtreecommitdiff
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;