diff options
author | Stafford Horne <shorne@gmail.com> | 2021-10-17 07:41:54 +0900 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-10-18 13:30:10 -0300 |
commit | 06acd6d1d6f485f2751dcfec881044938742bc8e (patch) | |
tree | a739da8d35582d3b6aaaa7c08d67b79ae9b7bf38 /nptl | |
parent | 5118dcac68c4eadfd6304bb33adde63d062dc07f (diff) | |
download | glibc-06acd6d1d6f485f2751dcfec881044938742bc8e.zip glibc-06acd6d1d6f485f2751dcfec881044938742bc8e.tar.gz glibc-06acd6d1d6f485f2751dcfec881044938742bc8e.tar.bz2 |
nptl: Fix tst-cancel7 and tst-cancelx7 pidfile race
The check for waiting for the pidfile to be created looks wrong. At the
point when ACCESS is run the pid file will always be created and
accessible as it is created during DO_PREPARE. This means that thread
cancellation may be performed before the pid is written to the pidfile.
This was found to be flaky when testing on my OpenRISC platform.
Fix this by using the semaphore to wait for pidfile pid write
completion.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'nptl')
-rw-r--r-- | nptl/tst-cancel7.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/nptl/tst-cancel7.c b/nptl/tst-cancel7.c index 54ed2a5..e926f44 100644 --- a/nptl/tst-cancel7.c +++ b/nptl/tst-cancel7.c @@ -115,16 +115,13 @@ do_test (void) { pthread_t th = xpthread_create (NULL, tf, NULL); - do - nanosleep (&(struct timespec) { .tv_sec = 0, .tv_nsec = 100000000 }, NULL); - while (access (pidfilename, R_OK) != 0); + /* Wait to cancel until after the pid is written. */ + if (sem_wait (sem) != 0) + FAIL_EXIT1 ("sem_wait: %m"); xpthread_cancel (th); void *r = xpthread_join (th); - if (sem_wait (sem) != 0) - FAIL_EXIT1 ("sem_wait: %m"); - FILE *f = xfopen (pidfilename, "r+"); long long ll; |