]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix nptl/tst-setuid3.c
authorPaul E. Murphy <murphyp@linux.vnet.ibm.com>
Tue, 19 Jan 2016 19:42:44 +0000 (13:42 -0600)
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Fri, 22 Jan 2016 16:21:03 +0000 (14:21 -0200)
pthread_barrier_wait can return either PTHREAD_BARRIER_SERIAL_THREAD
or 0.  Posix makes no guarantees about which thread return the unique
value.

Additionally, pthread_join was not called despite seemingly checking
for the error.

ChangeLog
nptl/tst-setuid3.c

index b07621be9e3582d7da437ac19644bb010fafd889..9418e262cc212f0833b4756f09d04558343dc35c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2016-01-22  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
+
+       * nptl/tst-setuid3.c (is_invalid_barrier_ret): New function.
+       (thread_func): Use new function to simplify barrier check.
+       (do_test): Use new function to simplify checking barrier exit
+       code, and actually join the child thread.
+
 2016-01-22  Paul E. Murphy  <murphyp@linux.vnet.ibm.com>
 
        * sysdeps/unix/sysv/linux/powerpc/htm.h (__libc_tbegin): Remove
index e017934f8b349716ec6a82fa9525ae99c26b112a..40dbb2a62cd1d3128950f8169956c06b9947a576 100644 (file)
@@ -33,14 +33,21 @@ static pthread_barrier_t barrier2;
 #define FAIL_ERR(fmt, ...) \
   do { printf ("FAIL: " fmt ": %m\n", __VA_ARGS__); _exit (1); } while (0)
 
+/* True if x is not a successful return code from pthread_barrier_wait.  */
+static inline bool
+is_invalid_barrier_ret (int x)
+{
+  return x != 0 && x != PTHREAD_BARRIER_SERIAL_THREAD;
+}
+
 static void *
 thread_func (void *ctx __attribute__ ((unused)))
 {
   int ret = pthread_barrier_wait (&barrier1);
-  if (ret != PTHREAD_BARRIER_SERIAL_THREAD && ret != 0)
+  if (is_invalid_barrier_ret (ret))
     FAIL ("pthread_barrier_wait (barrier1) (on thread): %d", ret);
   ret = pthread_barrier_wait (&barrier2);
-  if (ret != PTHREAD_BARRIER_SERIAL_THREAD && ret != 0)
+  if (is_invalid_barrier_ret (ret))
     FAIL ("pthread_barrier_wait (barrier2) (on thread): %d", ret);
   return NULL;
 }
@@ -86,7 +93,7 @@ do_test (void)
 
   /* Ensure that the thread is running properly.  */
   ret = pthread_barrier_wait (&barrier1);
-  if (ret != 0)
+  if (is_invalid_barrier_ret (ret))
     FAIL ("pthread_barrier_wait (barrier1): %d", ret);
 
   setuid_failure (2);
@@ -97,10 +104,11 @@ do_test (void)
 
   /* Shutdown.  */
   ret = pthread_barrier_wait (&barrier2);
-  if (ret != PTHREAD_BARRIER_SERIAL_THREAD && ret != 0)
+  if (is_invalid_barrier_ret (ret))
     FAIL ("pthread_barrier_wait (barrier2): %d", ret);
 
-  if (ret != PTHREAD_BARRIER_SERIAL_THREAD && ret != 0)
+  ret = pthread_join (thread, NULL);
+  if (ret != 0)
     FAIL ("pthread_join: %d", ret);
 
   return 0;