[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r5900 - in glibc-package/branches/eglibc-2.18/debian: . patches patches/hurd-i386



Author: sthibault
Date: 2013-12-31 12:38:37 +0000 (Tue, 31 Dec 2013)
New Revision: 5900

Added:
   glibc-package/branches/eglibc-2.18/debian/patches/hurd-i386/tg-tls_thread_leak.diff
Modified:
   glibc-package/branches/eglibc-2.18/debian/changelog
   glibc-package/branches/eglibc-2.18/debian/patches/series
Log:
  * patches/hurd-i386/tg-tls_thread_leak.diff: New patch to fix port leak.


Modified: glibc-package/branches/eglibc-2.18/debian/changelog
===================================================================
--- glibc-package/branches/eglibc-2.18/debian/changelog	2013-12-31 12:30:37 UTC (rev 5899)
+++ glibc-package/branches/eglibc-2.18/debian/changelog	2013-12-31 12:38:37 UTC (rev 5900)
@@ -22,6 +22,7 @@
     creation.
   * patches/hurd-i386/tg-sigstate_thread_reference.diff: New patch to fix
     sigstate thread reference counting.
+  * patches/hurd-i386/tg-tls_thread_leak.diff: New patch to fix port leak.
 
  -- Adam Conrad <adconrad@ubuntu.com>  Tue, 10 Dec 2013 01:59:47 -0700
 

Added: glibc-package/branches/eglibc-2.18/debian/patches/hurd-i386/tg-tls_thread_leak.diff
===================================================================
--- glibc-package/branches/eglibc-2.18/debian/patches/hurd-i386/tg-tls_thread_leak.diff	                        (rev 0)
+++ glibc-package/branches/eglibc-2.18/debian/patches/hurd-i386/tg-tls_thread_leak.diff	2013-12-31 12:38:37 UTC (rev 5900)
@@ -0,0 +1,99 @@
+From: Richard Braun <rbraun@sceen.net>
+Subject: [PATCH] Hurd: fix port leak in TLS
+
+Depending on whether the thread is the main thread or not, the threading
+library can have trouble determining whether the thread reference in the
+TCB is valid. The simple solution is to let the threading library
+initialize the TCB, and use a temporary reference when initializing TLS.
+
+* sysdeps/mach/hurd/i386/tls.h (_hurd_tls_init): Use a temporary thread
+reference.
+
+---
+ sysdeps/mach/hurd/i386/tls.h | 35 +++++++++++++++++++++++------------
+ 1 file changed, 23 insertions(+), 12 deletions(-)
+
+diff --git a/sysdeps/mach/hurd/i386/tls.h b/sysdeps/mach/hurd/i386/tls.h
+index 4f4c7c5..07c02e0 100644
+--- a/sysdeps/mach/hurd/i386/tls.h
++++ b/sysdeps/mach/hurd/i386/tls.h
+@@ -58,6 +58,8 @@ static inline const char * __attribute__ ((unused))
+ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
+ {
+   HURD_TLS_DESC_DECL (desc, tcb);
++  thread_t self = __mach_thread_self ();
++  const char *msg = NULL;
+ 
+   if (!secondcall)
+     {
+@@ -65,25 +67,26 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
+ 	 from the TLS point of view.  */
+       tcb->tcb = tcb;
+ 
+-      /* Cache our thread port.  */
+-      tcb->self = __mach_thread_self ();
+-
+       /* Get the first available selector.  */
+       int sel = -1;
+-      kern_return_t err = __i386_set_gdt (tcb->self, &sel, desc);
++      kern_return_t err = __i386_set_gdt (self, &sel, desc);
+       if (err == MIG_BAD_ID)
+ 	{
+ 	  /* Old kernel, use a per-thread LDT.  */
+ 	  sel = 0x27;
+-	  err = __i386_set_ldt (tcb->self, sel, &desc, 1);
++	  err = __i386_set_ldt (self, sel, &desc, 1);
+ 	  assert_perror (err);
+ 	  if (err)
+-	    return "i386_set_ldt failed";
++	    {
++	      msg = "i386_set_ldt failed";
++	      goto out;
++	    }
+ 	}
+       else if (err)
+ 	{
+ 	  assert_perror (err); /* Separate from above with different line #. */
+-	  return "i386_set_gdt failed";
++	  msg = "i386_set_gdt failed";
++	  goto out;
+ 	}
+ 
+       /* Now install the new selector.  */
+@@ -96,21 +99,29 @@ _hurd_tls_init (tcbhead_t *tcb, int secondcall)
+       asm ("mov %%gs, %w0" : "=q" (sel) : "0" (0));
+       if (__builtin_expect (sel, 0x50) & 4) /* LDT selector */
+ 	{
+-	  kern_return_t err = __i386_set_ldt (tcb->self, sel, &desc, 1);
++	  kern_return_t err = __i386_set_ldt (self, sel, &desc, 1);
+ 	  assert_perror (err);
+ 	  if (err)
+-	    return "i386_set_ldt failed";
++	    {
++	      msg = "i386_set_ldt failed";
++	      goto out;
++	    }
+ 	}
+       else
+ 	{
+-	  kern_return_t err = __i386_set_gdt (tcb->self, &sel, desc);
++	  kern_return_t err = __i386_set_gdt (self, &sel, desc);
+ 	  assert_perror (err);
+ 	  if (err)
+-	    return "i386_set_gdt failed";
++	    {
++	      msg = "i386_set_gdt failed";
++	      goto out;
++	    }
+ 	}
+     }
+ 
+-  return 0;
++out:
++  __mach_port_deallocate (__mach_task_self (), self);
++  return msg;
+ }
+ 
+ /* Code to initially initialize the thread pointer.  This might need
+-- 
+tg: (9a079e2..) t/tls_thread_leak (depends on: baseline)

Modified: glibc-package/branches/eglibc-2.18/debian/patches/series
===================================================================
--- glibc-package/branches/eglibc-2.18/debian/patches/series	2013-12-31 12:30:37 UTC (rev 5899)
+++ glibc-package/branches/eglibc-2.18/debian/patches/series	2013-12-31 12:38:37 UTC (rev 5900)
@@ -146,6 +146,7 @@
 hurd-i386/tg-nfds-poll.diff
 hurd-i386/tg-sigstate_locking.diff
 hurd-i386/tg-sigstate_thread_reference.diff
+hurd-i386/tg-tls_thread_leak.diff
 
 i386/local-biarch.diff
 i386/local-cmov.diff


Reply to: