diff options
Diffstat (limited to 'linuxthreads_db/td_ta_map_id2thr.c')
-rw-r--r-- | linuxthreads_db/td_ta_map_id2thr.c | 22 |
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; |