mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-22 10:50:07 +00:00
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:
parent
af8ea0f449
commit
fad7e4d706
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user