[BZ #10069]
authorUlrich Drepper <drepper@redhat.com>
Sun, 19 Apr 2009 21:45:02 +0000 (21:45 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 19 Apr 2009 21:45:02 +0000 (21:45 +0000)
2009-04-19  Ulrich Drepper  <drepper@redhat.com>
[BZ #10069]
* elf/dl-open.c (dl_open_worker): We cannot guarantee that we can load
an object that uses static TLS if the TLS modid is higher than the
reserve we always allocate.  At least for multi-threaded code.

ChangeLog
elf/dl-open.c

index 79035e8..7e46b68 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-04-19  Ulrich Drepper  <drepper@redhat.com>
+
+       [BZ #10069]
+       * elf/dl-open.c (dl_open_worker): We cannot guarantee that we can load
+       an object that uses static TLS if the TLS modid is higher than the
+       reserve we always allocate.  At least for multi-threaded code.
+
 2009-04-18  Ulrich Drepper  <drepper@redhat.com>
 
        * stdlib/strfmon_l.c (__vstrfmon_l): Don't wrap when computing width.
index 458cf0c..c3f0e42 100644 (file)
@@ -490,6 +490,18 @@ dl_open_worker (void *a)
 
          if (imap->l_need_tls_init)
            {
+             /* For static TLS we have to allocate the memory here
+                and now.  This includes allocating memory in the DTV.
+                But we cannot change any DTV other than our own. So,
+                if we cannot guarantee that there is room in the DTV
+                we don't even try it and fail the load.
+
+                XXX We could track the minimum DTV slots allocated in
+                all threads.  */
+             if (! RTLD_SINGLE_THREAD_P && imap->l_tls_modid > DTV_SURPLUS)
+               _dl_signal_error (0, "dlopen", NULL, N_("\
+cannot load any more object with static TLS"));
+
              imap->l_need_tls_init = 0;
 #ifdef SHARED
              /* Update the slot information data for at least the