mirror of
https://sourceware.org/git/glibc.git
synced 2024-09-20 00:19:57 +00:00
Fix a few more problem with the recent setxid changes.
This commit is contained in:
parent
462a5227b0
commit
1d78f2996d
@ -1,3 +1,11 @@
|
||||
2010-03-09 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* pthread_create.c (__pthread_create_2_1): If priorities are incorrect
|
||||
and the call fails wake eventually waiting setxid threads. Don't free
|
||||
stack here if we try starting a thread.
|
||||
* sysdeps/pthread/createthread.c (do_clone): Only wake setxid waiter
|
||||
if the clone call failed.
|
||||
|
||||
2010-03-08 Andreas Schwab <schwab@redhat.com>
|
||||
|
||||
* pthread_create.c (__pthread_create_2_1): Don't set setxid_futex.
|
||||
|
@ -537,33 +537,23 @@ __pthread_create_2_1 (newthread, attr, start_routine, arg)
|
||||
if (pd->schedparam.sched_priority < minprio
|
||||
|| pd->schedparam.sched_priority > maxprio)
|
||||
{
|
||||
err = EINVAL;
|
||||
goto errout;
|
||||
/* Perhaps a thread wants to change the IDs and if waiting
|
||||
for this stillborn thread. */
|
||||
if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0)
|
||||
== -2, 0))
|
||||
lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
|
||||
|
||||
__deallocate_stack (pd);
|
||||
|
||||
return EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass the descriptor to the caller. */
|
||||
*newthread = (pthread_t) pd;
|
||||
|
||||
/* Remember whether the thread is detached or not. In case of an
|
||||
error we have to free the stacks of non-detached stillborn
|
||||
threads. */
|
||||
bool is_detached = IS_DETACHED (pd);
|
||||
|
||||
/* Start the thread. */
|
||||
err = create_thread (pd, iattr, STACK_VARIABLES_ARGS);
|
||||
if (err != 0)
|
||||
{
|
||||
/* Something went wrong. Free the resources. */
|
||||
if (!is_detached)
|
||||
{
|
||||
errout:
|
||||
__deallocate_stack (pd);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return create_thread (pd, iattr, STACK_VARIABLES_ARGS);
|
||||
}
|
||||
versioned_symbol (libpthread, __pthread_create_2_1, pthread_create, GLIBC_2_1);
|
||||
|
||||
|
@ -75,19 +75,17 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
|
||||
int rc = ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags,
|
||||
pd, &pd->tid, TLS_VALUE, &pd->tid);
|
||||
|
||||
/* Allow setxid from now onwards. */
|
||||
if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0) == -2, 0))
|
||||
lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
|
||||
|
||||
if (__builtin_expect (rc == -1, 0))
|
||||
{
|
||||
atomic_decrement (&__nptl_nthreads); /* Oops, we lied for a second. */
|
||||
|
||||
/* Failed. If the thread is detached, remove the TCB here since
|
||||
the caller cannot do this. The caller remembered the thread
|
||||
as detached and cannot reverify that it is not since it must
|
||||
not access the thread descriptor again. */
|
||||
if (IS_DETACHED (pd))
|
||||
/* Perhaps a thread wants to change the IDs and if waiting
|
||||
for this stillborn thread. */
|
||||
if (__builtin_expect (atomic_exchange_acq (&pd->setxid_futex, 0)
|
||||
== -2, 0))
|
||||
lll_futex_wake (&pd->setxid_futex, 1, LLL_PRIVATE);
|
||||
|
||||
/* Free the resources. */
|
||||
__deallocate_stack (pd);
|
||||
|
||||
/* We have to translate error codes. */
|
||||
@ -120,6 +118,9 @@ do_clone (struct pthread *pd, const struct pthread_attr *attr,
|
||||
(void) INTERNAL_SYSCALL (tkill, err2, 2, pd->tid, SIGCANCEL);
|
||||
#endif
|
||||
|
||||
/* We do not free the stack here because the canceled thread
|
||||
itself will do this. */
|
||||
|
||||
return (INTERNAL_SYSCALL_ERROR_P (res, err)
|
||||
? INTERNAL_SYSCALL_ERRNO (res, err)
|
||||
: 0);
|
||||
|
Loading…
Reference in New Issue
Block a user