aboutsummaryrefslogtreecommitdiff
path: root/linuxthreads_db/td_ta_map_id2thr.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1999-11-05 02:26:16 +0000
committerUlrich Drepper <drepper@redhat.com>1999-11-05 02:26:16 +0000
commit9532eb67a4a92baab960d8d37bfa28048285dabb (patch)
tree179887a0e1239d9aebb41cffb1134f019712b56b /linuxthreads_db/td_ta_map_id2thr.c
parentab86fbb1d2866df567219904982dac61751808e5 (diff)
downloadglibc-9532eb67a4a92baab960d8d37bfa28048285dabb.tar
glibc-9532eb67a4a92baab960d8d37bfa28048285dabb.tar.gz
glibc-9532eb67a4a92baab960d8d37bfa28048285dabb.tar.bz2
glibc-9532eb67a4a92baab960d8d37bfa28048285dabb.zip
Update.
1999-11-03 Ulrich Drepper <drepper@cygnus.com> * Versions.def: Add version for libthread_db.
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;