Skip to content

Commit

Permalink
Fix nptl/tst-setuid3.c
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Paul E. Murphy authored and Tulio Magno Quites Machado Filho committed Jan 22, 2016
1 parent af8ea0f commit fad7e4d
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
7 changes: 7 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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
Expand Down
18 changes: 13 additions & 5 deletions nptl/tst-setuid3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down

0 comments on commit fad7e4d

Please sign in to comment.