test-dlclose-exit-race: avoid hang on pthread_create error

This test depends on the "last" function being called in a
different thread than the "first" function, as "last" posts
a semaphore that "first" is waiting on.  However, if pthread_create
fails - for example, if running in an older container before
the clone3()-in-container-EPERM fixes - exit() is called in the
same thread as everything else, the semaphore never gets posted,
and first hangs.

The fix is to pre-post that semaphore before a single-threaded
exit.

Reviewed-by: Arjun Shankar <arjun@redhat.com>
This commit is contained in:
DJ Delorie 2021-08-03 16:33:29 -04:00
parent b17e842a60
commit ac30324c67

View File

@ -29,6 +29,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <semaphore.h>
#include <support/check.h>
#include <support/xdlfcn.h>
@ -64,6 +65,7 @@ last (void)
int
main (void)
{
int value;
void *dso;
pthread_t thread;
@ -71,7 +73,17 @@ main (void)
dso = xdlopen ("$ORIGIN/test-dlclose-exit-race-helper.so",
RTLD_NOW|RTLD_GLOBAL);
thread = xpthread_create (NULL, exit_thread, NULL);
if ((value = pthread_create (&thread, NULL, exit_thread, NULL)) != 0)
{
/* If pthread_create fails, then exit() is called in the main
thread instead of a second thread, so the semaphore post that
would have happened in 'last' gets blocked behind the call to
first() - which is waiting on the semaphore, and thus
hangs. */
sem_post (&order2);
errno = value;
FAIL_EXIT1 ("pthread_create: %m");
}
xdlclose (dso);
xpthread_join (thread);