re PR libgcc/48076 (Unsafe double checked locking in __emutls_get_address)

PR libgcc/48076
        * emutls.c (__emutls_get_address): Avoid race condition between
        obj->loc.offset read and emutls_key initialization.

From-SVN: r193958
This commit is contained in:
Richard Henderson 2012-11-29 13:06:02 -08:00 committed by Richard Henderson
parent 8818300ee2
commit 3b9fd6c5fa
2 changed files with 8 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2012-11-28 Richard Henderson <rth@redhat.com>
PR libgcc/48076
* emutls.c (__emutls_get_address): Avoid race condition between
obj->loc.offset read and emutls_key initialization.
2012-11-04 Uros Bizjak <ubizjak@gmail.com>
PR target/55175

View File

@ -136,7 +136,7 @@ __emutls_get_address (struct __emutls_object *obj)
#ifndef __GTHREADS
abort ();
#else
pointer offset = obj->loc.offset;
pointer offset = __atomic_load_n (&obj->loc.offset, __ATOMIC_ACQUIRE);
if (__builtin_expect (offset == 0, 0))
{
@ -147,7 +147,7 @@ __emutls_get_address (struct __emutls_object *obj)
if (offset == 0)
{
offset = ++emutls_size;
obj->loc.offset = offset;
__atomic_store_n (&obj->loc.offset, offset, __ATOMIC_RELEASE);
}
__gthread_mutex_unlock (&emutls_mutex);
}