#include "rculfhash-internal.h"
#include "urcu-flavor.h"
+/*
+ * We need to lock pthread exit, which deadlocks __nptl_setxid in the
+ * runas clone.
+ * This work-around will be allowed to be removed when runas.c gets
+ * changed to do an exec() before issuing seteuid/setegid.
+ * See http://sourceware.org/bugzilla/show_bug.cgi?id=10184 for details.
+ */
+pthread_mutex_t lttng_libc_state_lock = PTHREAD_MUTEX_INITIALIZER;
+
/*
* Split-counters lazily update the global counter each 1024
* addition/removal. It automatically keeps track of resize required.
partition_len = len >> cds_lfht_get_count_order_ulong(nr_threads);
work = calloc(nr_threads, sizeof(*work));
assert(work);
+ pthread_mutex_lock(<tng_libc_state_lock);
for (thread = 0; thread < nr_threads; thread++) {
work[thread].ht = ht;
work[thread].i = i;
ret = pthread_join(work[thread].thread_id, NULL);
assert(!ret);
}
+ pthread_mutex_unlock(<tng_libc_state_lock);
free(work);
}
int run_as(int (*cmd)(void *data), void *data, uid_t uid, gid_t gid)
{
if (!getenv("LTTNG_DEBUG_NOCLONE")) {
+ int ret;
+
DBG("Using run_as_clone");
- return run_as_clone(cmd, data, uid, gid);
+ pthread_mutex_lock(<tng_libc_state_lock);
+ ret = run_as_clone(cmd, data, uid, gid);
+ pthread_mutex_unlock(<tng_libc_state_lock);
+ return ret;
} else {
DBG("Using run_as_noclone");
return run_as_noclone(cmd, data, uid, gid);
*/
#include <unistd.h>
+#include <pthread.h>
int run_as_mkdir_recursive(const char *path, mode_t mode, uid_t uid, gid_t gid);
int run_as_mkdir(const char *path, mode_t mode, uid_t uid, gid_t gid);
int run_as_open(const char *path, int flags, mode_t mode, uid_t uid, gid_t gid);
+/*
+ * We need to lock pthread exit, which deadlocks __nptl_setxid in the
+ * clone.
+ */
+extern pthread_mutex_t lttng_libc_state_lock;
+
#endif /* _RUNAS_H */