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

r3462 - in glibc-package/trunk/debian: . patches patches/any



Author: aurel32
Date: 2009-05-08 09:58:28 +0000 (Fri, 08 May 2009)
New Revision: 3462

Added:
   glibc-package/trunk/debian/patches/any/local-revert-3270.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
Log:
  * any/local-revert-3270.diff: new patch to revert fix for PR nptl/3270.
    (closes: bug#527541).



Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog	2009-05-07 04:45:39 UTC (rev 3461)
+++ glibc-package/trunk/debian/changelog	2009-05-08 09:58:28 UTC (rev 3462)
@@ -3,9 +3,11 @@
   [ Petr Salinger ]
   * kfreebsd/local-sysdeps.diff: update to revision 2503 (from glibc-bsd).
 
-  * 
+  [ Aurelien Jarno ]
+  * any/local-revert-3270.diff: new patch to revert fix for PR nptl/3270.
+    (closes: bug#527541).
 
- -- Aurelien Jarno <aurel32@debian.org>  Tue, 05 May 2009 15:40:40 +0200
+ -- Aurelien Jarno <aurel32@debian.org>  Fri, 08 May 2009 11:57:16 +0200
 
 eglibc (2.9-11) unstable; urgency=low
 

Added: glibc-package/trunk/debian/patches/any/local-revert-3270.diff
===================================================================
--- glibc-package/trunk/debian/patches/any/local-revert-3270.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/any/local-revert-3270.diff	2009-05-08 09:58:28 UTC (rev 3462)
@@ -0,0 +1,197 @@
+--- a/nptl/init.c	(révision 5284)
++++ b/nptl/init.c	(révision 5285)
+@@ -221,12 +221,21 @@
+ 
+   /* Reset the SETXID flag.  */
+   struct pthread *self = THREAD_SELF;
+-  int flags = THREAD_GETMEM (self, cancelhandling);
+-  THREAD_SETMEM (self, cancelhandling, flags & ~SETXID_BITMASK);
++  int flags, newval;
++  do
++    {
++      flags = THREAD_GETMEM (self, cancelhandling);
++      newval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling,
++					  flags & ~SETXID_BITMASK, flags);
++    }
++  while (flags != newval);
+ 
+   /* And release the futex.  */
+   self->setxid_futex = 1;
+   lll_futex_wake (&self->setxid_futex, 1, LLL_PRIVATE);
++
++  if (atomic_decrement_val (&__xidcmd->cntr) == 0)
++    lll_futex_wake (&__xidcmd->cntr, 1, LLL_PRIVATE);
+ }
+ 
+ 
+--- a/nptl/allocatestack.c	(révision 5284)
++++ b/nptl/allocatestack.c	(révision 5285)
+@@ -904,23 +904,54 @@
+ 
+ static void
+ internal_function
+-setxid_signal_thread (struct xid_command *cmdp, struct pthread *t)
++setxid_mark_thread (struct xid_command *cmdp, struct pthread *t)
+ {
+-  if (! IS_DETACHED (t))
++  int ch;
++
++  /* Don't let the thread exit before the setxid handler runs.  */
++  t->setxid_futex = 0;
++
++  do
+     {
+-      int ch;
+-      do
+-	{
+-	  ch = t->cancelhandling;
++      ch = t->cancelhandling;
+ 
+-	  /* If the thread is exiting right now, ignore it.  */
+-	  if ((ch & EXITING_BITMASK) != 0)
+-	    return;
+-	}
+-      while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
+-						   ch | SETXID_BITMASK, ch));
++      /* If the thread is exiting right now, ignore it.  */
++      if ((ch & EXITING_BITMASK) != 0)
++	return;
+     }
++  while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
++					       ch | SETXID_BITMASK, ch));
++}
+ 
++
++static void
++internal_function
++setxid_unmark_thread (struct xid_command *cmdp, struct pthread *t)
++{
++  int ch;
++
++  do
++    {
++      ch = t->cancelhandling;
++      if ((ch & SETXID_BITMASK) == 0)
++	return;
++    }
++  while (atomic_compare_and_exchange_bool_acq (&t->cancelhandling,
++					       ch & ~SETXID_BITMASK, ch));
++
++  /* Release the futex just in case.  */
++  t->setxid_futex = 1;
++  lll_futex_wake (&t->setxid_futex, 1, LLL_PRIVATE);
++}
++
++
++static int
++internal_function
++setxid_signal_thread (struct xid_command *cmdp, struct pthread *t)
++{
++  if ((t->cancelhandling & SETXID_BITMASK) == 0)
++    return 0;
++
+   int val;
+   INTERNAL_SYSCALL_DECL (err);
+ #if __ASSUME_TGKILL
+@@ -936,8 +967,14 @@
+     val = INTERNAL_SYSCALL (tkill, err, 2, t->tid, SIGSETXID);
+ #endif
+ 
++  /* If this failed, it must have had not started yet or else exited.  */
+   if (!INTERNAL_SYSCALL_ERROR_P (val, err))
+-    atomic_increment (&cmdp->cntr);
++    {
++      atomic_increment (&cmdp->cntr);
++      return 1;
++    }
++  else
++    return 0;
+ }
+ 
+ 
+@@ -945,6 +982,7 @@
+ attribute_hidden
+ __nptl_setxid (struct xid_command *cmdp)
+ {
++  int signalled;
+   int result;
+   lll_lock (stack_cache_lock, LLL_PRIVATE);
+ 
+@@ -961,7 +999,7 @@
+       if (t == self)
+ 	continue;
+ 
+-      setxid_signal_thread (cmdp, t);
++      setxid_mark_thread (cmdp, t);
+     }
+ 
+   /* Now the list with threads using user-allocated stacks.  */
+@@ -971,16 +1009,63 @@
+       if (t == self)
+ 	continue;
+ 
+-      setxid_signal_thread (cmdp, t);
++      setxid_mark_thread (cmdp, t);
+     }
+ 
+-  int cur = cmdp->cntr;
+-  while (cur != 0)
++  /* Iterate until we don't succeed in signalling anyone.  That means
++     we have gotten all running threads, and their children will be
++     automatically correct once started.  */
++  do
+     {
+-      lll_futex_wait (&cmdp->cntr, cur, LLL_PRIVATE);
+-      cur = cmdp->cntr;
++      signalled = 0;
++
++      list_for_each (runp, &stack_used)
++	{
++	  struct pthread *t = list_entry (runp, struct pthread, list);
++	  if (t == self)
++	    continue;
++
++	  signalled += setxid_signal_thread (cmdp, t);
++	}
++
++      list_for_each (runp, &__stack_user)
++	{
++	  struct pthread *t = list_entry (runp, struct pthread, list);
++	  if (t == self)
++	    continue;
++
++	  signalled += setxid_signal_thread (cmdp, t);
++	}
++
++      int cur = cmdp->cntr;
++      while (cur != 0)
++	{
++	  lll_futex_wait (&cmdp->cntr, cur, LLL_PRIVATE);
++	  cur = cmdp->cntr;
++	}
+     }
++  while (signalled != 0);
+ 
++  /* Clean up flags, so that no thread blocks during exit waiting
++     for a signal which will never come.  */
++  list_for_each (runp, &stack_used)
++    {
++      struct pthread *t = list_entry (runp, struct pthread, list);
++      if (t == self)
++	continue;
++
++      setxid_unmark_thread (cmdp, t);
++    }
++
++  list_for_each (runp, &__stack_user)
++    {
++      struct pthread *t = list_entry (runp, struct pthread, list);
++      if (t == self)
++	continue;
++
++      setxid_unmark_thread (cmdp, t);
++    }
++
+   /* This must be last, otherwise the current thread might not have
+      permissions to send SIGSETXID syscall to the other threads.  */
+   INTERNAL_SYSCALL_DECL (err);

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series	2009-05-07 04:45:39 UTC (rev 3461)
+++ glibc-package/trunk/debian/patches/series	2009-05-08 09:58:28 UTC (rev 3462)
@@ -205,3 +205,4 @@
 any/submitted-nss-nsswitch.diff
 any/submitted-install-map-files.diff
 any/submitted-broken-dns.diff
+any/local-revert-3270.diff


Reply to: