]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libgcc/48076 (Unsafe double checked locking in __emutls_get_address)
authorRichard Henderson <rth@redhat.com>
Thu, 29 Nov 2012 21:11:00 +0000 (13:11 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 29 Nov 2012 21:11:00 +0000 (13:11 -0800)
PR libgcc/48076
        * emutls.c (__emutls_get_address): Add memory barrier before
        referencing emutls_key.

From-SVN: r193959

gcc/ChangeLog
gcc/emutls.c

index 33a8b4f0a5ac4f301e07bcde0f7840e78c77981f..2eb5a7e3401b2faca10f943874241a523ab5cad5 100644 (file)
@@ -1,3 +1,9 @@
+2012-11-24  Richard Henderson  <rth@redhat.com>
+
+       PR libgcc/48076
+       * emutls.c (__emutls_get_address): Add memory barrier before
+       referencing emutls_key.
+
 2012-11-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * doc/install.texi (sparc64-x-solaris2): Mention MPC as well.
index b7ee3bdfa7cec09b1f43aba5bed1132e71cea4ee..fcf6eb56f9bf5dcccfe7c77c4be0a41a0611a570 100644 (file)
@@ -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))
     {