public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] x86: Fix THREAD_SELF definition to avoid ld.so crash (bug 27004)
@ 2020-12-03 12:50 Florian Weimer
  0 siblings, 0 replies; only message in thread
From: Florian Weimer @ 2020-12-03 12:50 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1d9cbb96082e646de7515a1667efa041ffb79958

commit 1d9cbb96082e646de7515a1667efa041ffb79958
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Dec 3 13:33:44 2020 +0100

    x86: Fix THREAD_SELF definition to avoid ld.so crash (bug 27004)
    
    The previous definition of THREAD_SELF did not tell the compiler
    that %fs (or %gs) usage is invalid for the !DL_LOOKUP_GSCOPE_LOCK
    case in _dl_lookup_symbol_x.  As a result, ld.so could try to use the
    TCB before it was initialized.
    
    As the comment in tls.h explains, asm volatile is undesirable here.
    Using the __seg_fs (or __seg_gs) namespace does not interfere with
    optimization, and expresses that THREAD_SELF is potentially trapping.

Diff:
---
 sysdeps/i386/nptl/tls.h   | 7 ++++++-
 sysdeps/x86_64/nptl/tls.h | 7 ++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/sysdeps/i386/nptl/tls.h b/sysdeps/i386/nptl/tls.h
index b74347bacd..ab98c24a02 100644
--- a/sysdeps/i386/nptl/tls.h
+++ b/sysdeps/i386/nptl/tls.h
@@ -234,11 +234,16 @@ tls_fill_user_desc (union user_desc_init *desc,
    assignments like
 	pthread_descr self = thread_self();
    do not get optimized away.  */
-# define THREAD_SELF \
+# if __GNUC_PREREQ (6, 0)
+#  define THREAD_SELF \
+  (*(struct pthread *__seg_gs *) offsetof (struct pthread, header.self))
+# else
+#  define THREAD_SELF \
   ({ struct pthread *__self;						      \
      asm ("movl %%gs:%c1,%0" : "=r" (__self)				      \
 	  : "i" (offsetof (struct pthread, header.self)));		      \
      __self;})
+# endif
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF \
diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h
index a08bf972de..ccb5f24d92 100644
--- a/sysdeps/x86_64/nptl/tls.h
+++ b/sysdeps/x86_64/nptl/tls.h
@@ -180,11 +180,16 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80,
    assignments like
 	pthread_descr self = thread_self();
    do not get optimized away.  */
-# define THREAD_SELF \
+# if __GNUC_PREREQ (6, 0)
+#  define THREAD_SELF \
+  (*(struct pthread *__seg_fs *) offsetof (struct pthread, header.self))
+# else
+#  define THREAD_SELF \
   ({ struct pthread *__self;						      \
      asm ("mov %%fs:%c1,%0" : "=r" (__self)				      \
 	  : "i" (offsetof (struct pthread, header.self)));	 	      \
      __self;})
+# endif
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF_INCLUDE  <sys/reg.h> /* For the FS constant.  */


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-03 12:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-03 12:50 [glibc] x86: Fix THREAD_SELF definition to avoid ld.so crash (bug 27004) Florian Weimer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).