From: Richard Henderson Date: Thu, 29 Nov 2012 21:11:00 +0000 (-0800) Subject: re PR libgcc/48076 (Unsafe double checked locking in __emutls_get_address) X-Git-Tag: releases/gcc-4.6.4~263 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba3373f46899eedf11c19b1fda9408818b3dc831;p=thirdparty%2Fgcc.git re PR libgcc/48076 (Unsafe double checked locking in __emutls_get_address) PR libgcc/48076 * emutls.c (__emutls_get_address): Add memory barrier before referencing emutls_key. From-SVN: r193959 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 33a8b4f0a5ac..2eb5a7e3401b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-11-24 Richard Henderson + + PR libgcc/48076 + * emutls.c (__emutls_get_address): Add memory barrier before + referencing emutls_key. + 2012-11-09 Eric Botcazou * doc/install.texi (sparc64-x-solaris2): Mention MPC as well. diff --git a/gcc/emutls.c b/gcc/emutls.c index b7ee3bdfa7ce..fcf6eb56f9bf 100644 --- a/gcc/emutls.c +++ b/gcc/emutls.c @@ -151,6 +151,9 @@ __emutls_get_address (struct __emutls_object *obj) __gthread_mutex_unlock (&emutls_mutex); } + /* Do not allow emutls_key to be loaded before offset. */ + __sync_synchronize(); + struct __emutls_array *arr = __gthread_getspecific (emutls_key); if (__builtin_expect (arr == NULL, 0)) {