This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Fix nptl/tst-setuid3.c
- From: "Paul E. Murphy" <murphyp at linux dot vnet dot ibm dot com>
- To: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>, Florian Weimer <fweimer at redhat dot com>
- Cc: "libc-alpha at sourceware dot org" <libc-alpha at sourceware dot org>, Tulio Magno Quites Machado Filho <tuliom at linux dot vnet dot ibm dot com>
- Date: Tue, 19 Jan 2016 14:32:10 -0600
- Subject: Re: [PATCH] Fix nptl/tst-setuid3.c
- Authentication-results: sourceware.org; auth=none
- References: <569E97E2 dot 1000307 at linux dot vnet dot ibm dot com> <569E99CF dot 3020504 at redhat dot com> <569E9AA0 dot 3070208 at linaro dot org>
Thank you both for the review! Here is a minor update to use an
inline function instead as suggested by Florian.
On 01/19/2016 02:20 PM, Adhemerval Zanella wrote:
>
>
> On 19-01-2016 18:17, Florian Weimer wrote:
>> On 01/19/2016 09:09 PM, Paul E. Murphy wrote:
>>> 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.
>>>
>>> 2016-01-19 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
>>>
>>> * nptl/tst-setuid3.c (INVALID_BARRIER_WAIT): New macro.
>>> (do_test): Use macro to simplify checking barrier exit
>>> code, and actually join the child thread.
>>
>> Thanks for fixing this.
>>
>>> +/* True if pthread_barrier_wait returns without an error. */
>>> +#define INVALID_BARRIER_WAIT(x) ((x != 0) && \
>>> + (x != PTHREAD_BARRIER_SERIAL_THREAD))
>>
>> Please use an inline function or put parentheses around the x.
>>
>> Technically, this change is okay, but Adhemerval needs to decide if it
>> can go in during the freeze.
>>
>> Florian
>>
>
> LGTM, thanks.
>
>From bbd8418931aa493e9e9ecc658f41be605fa78301 Mon Sep 17 00:00:00 2001
From: "Paul E. Murphy" <murphyp@linux.vnet.ibm.com>
Date: Tue, 19 Jan 2016 13:42:44 -0600
Subject: [PATCH] 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.
2016-01-19 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.
---
nptl/tst-setuid3.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/nptl/tst-setuid3.c b/nptl/tst-setuid3.c
index e017934..a2a3efe 100644
--- a/nptl/tst-setuid3.c
+++ b/nptl/tst-setuid3.c
@@ -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 pthread_barrier_wait returns without an error. */
+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;
--
2.4.3