mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-21 11:54:28 +08:00
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: r193907
This commit is contained in:
parent
361a58da83
commit
f4919e4a82
@ -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-22 Georg-Johann Lay <avr@gjlay.de>
|
||||
|
||||
Adjust decimal point of signed accum mode to GCC default.
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user