From: Ivan Maidanski Date: Tue, 15 Nov 2011 11:01:52 +0000 (+0400) Subject: Implement precise value boundary check in GC_is_thread_tsd_valid X-Git-Tag: gc7_3alpha2~306 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f35de88159cc331f5d663e047f21605006937c27;p=gc Implement precise value boundary check in GC_is_thread_tsd_valid * pthread_support.c (GC_is_thread_tsd_valid): Check tsd more correctly using GC_thread and thread_local_freelists declarations; remove FIXME. * win32_threads.c (GC_is_thread_tsd_valid): Likewise. --- diff --git a/pthread_support.c b/pthread_support.c index 848756cc..610ce4bf 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -312,6 +312,7 @@ STATIC long GC_nprocs = 1; # if defined(USE_CUSTOM_SPECIFIC) void GC_check_tsd_marks(tsd *key); # endif + /* Check that all thread-local free-lists are completely marked. */ /* Also check that thread-specific-data structures are marked. */ void GC_check_tls(void) @@ -331,6 +332,7 @@ STATIC long GC_nprocs = 1; # endif } # endif /* GC_ASSERTIONS */ + #endif /* THREAD_LOCAL_ALLOC */ #ifdef PARALLEL_MARK @@ -600,16 +602,14 @@ GC_INNER unsigned char *GC_check_finalizer_nested(void) /* This is called from thread-local GC_malloc(). */ GC_bool GC_is_thread_tsd_valid(void *tsd) { - char *me; + GC_thread me; DCL_LOCK_STATE; LOCK(); - me = (char *)GC_lookup_thread(pthread_self()); + me = GC_lookup_thread(pthread_self()); UNLOCK(); - /* FIXME: We can check tsd more correctly (since now we have access */ - /* to the right declarations). This old algorithm (moved from */ - /* thread_local_alloc.c) checks only that it's close. */ - return((char *)tsd > me && (char *)tsd < me + 1000); + return (char *)tsd >= (char *)&me->tlfs + && (char *)tsd < (char *)&me->tlfs + sizeof(me->tlfs); } #endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */ diff --git a/win32_threads.c b/win32_threads.c index 1fa04456..8a401bc2 100644 --- a/win32_threads.c +++ b/win32_threads.c @@ -572,18 +572,16 @@ GC_INNER unsigned char *GC_check_finalizer_nested(void) /* This is called from thread-local GC_malloc(). */ GC_bool GC_is_thread_tsd_valid(void *tsd) { - char *me; + GC_thread me; DCL_LOCK_STATE; LOCK(); - me = (char *)GC_lookup_thread_inner(GetCurrentThreadId()); + me = GC_lookup_thread_inner(GetCurrentThreadId()); UNLOCK(); - /* FIXME: We can check tsd more correctly (since now we have access */ - /* to the right declarations). This old algorithm (moved from */ - /* thread_local_alloc.c) checks only that it's close. */ - return((char *)tsd > me && (char *)tsd < me + 1000); + return (char *)tsd >= (char *)&me->tlfs + && (char *)tsd < (char *)&me->tlfs + sizeof(me->tlfs); } -#endif +#endif /* GC_ASSERTIONS && THREAD_LOCAL_ALLOC */ /* Make sure thread descriptor t is not protected by the VDB */ /* implementation. */