Fix nptl/tst-setuid3.c

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.
This commit is contained in:
Paul E. Murphy 2016-01-19 13:42:44 -06:00 committed by Tulio Magno Quites Machado Filho
parent af8ea0f449
commit fad7e4d706
2 changed files with 20 additions and 5 deletions

View File

@ -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

View 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;